Tôi đang học về C# generics và tạo một số mã giả cho mục đích thử nghiệm. Vì vậy, tôi đang thử nghiệm các in Generic Modifier, trong đó xác định rằng các tham số kiểu là contravariant.Sử dụng phép so sánh chung với IList và IEnumerable
Với giao diện dưới đây:
public interface IInterfaceTest<in T>
{
void Method(T value);
void Method(IList<T> values);
void Method(IEnumerable<T> values);
}
Khi biên dịch, tôi nhận được thông báo lỗi:
[CS1961] đúng không hợp lệ: Các tham số kiểu 'T' phải invariantly hợp lệ trên 'IInterfaceTest.Method (IList)'. 'T' là contravariant.
Lỗi này chỉ liên quan đến dòng void Method(IEnumerable<T> values)
. Nếu dòng này bị xóa, tất cả đều hoạt động tốt.
Vì vậy, câu hỏi của tôi là: Tại sao tôi có thể sử dụng biến thể chung với IEnumerable
nhưng không với IList
? Tôi có quên gì không?
Cảm ơn.
'IList' không phải là, và không thể là, biến thể. –
SLaks
@SLaks: Tôi nghĩ OP nhận được điều đó, nhưng tại sao? (cũng sẽ giúp tôi) – Stefan
Vì nó có thể thay đổi. https://stackoverflow.com/a/2033921/34397 – SLaks