2010-04-21 21 views
5

Tôi không hiểu tại sao 'x' bên dưới chuyển đổi, nhưng 'y' và 'z' thì không.Hỗ trợ hiệp phương sai của C# 4 có làm tổ của generics không?

var list = new List<List<int>>(); 

IEnumerable<List<int>> x = list; 
List<IEnumerable<int>> y = list; 
IEnumerable<IEnumerable<int>> z = list; 

Tính năng hiệp phương sai mới chỉ đơn giản là không hoạt động trên Generics Generics hoặc tôi có làm điều gì sai? (Tôi muốn tránh sử dụng .Cố <> để thực hiện công việc y và z.)

Trả lời

7

"z" là tốt trong C# 4.0, IEnumerable<T> là biến thể. Tuy nhiên, List<T> không, bạn không thể thực hiện công việc "y".

trực giác, nếu nó là sau đó điều này sẽ có giá trị:

List<IEnumerable<int>> y = list 
y.Add(new Stack<int>()); 

nào phá vỡ lời hứa rằng "danh sách" chỉ có thể chứa List<int> yếu tố.

+0

Ok một phần của vấn đề là 'z' không hoạt động đối với tôi vì tôi vẫn đang nhắm mục tiêu 3.5. Rất tiếc. Cảm ơn lời giải thích về 'y' không hoạt động, điều đó có ý nghĩa. – scobi

1

Bạn đang phạm một số sai lầm ở đây. Đầu tiên, hiệp phương sai và contravariance không được hỗ trợ cho các loại giá trị, vì vậy bất cứ điều gì bạn cố gắng làm với "int" sẽ không hoạt động.

Thứ hai, ví dụ giá trị kiểm tra cho đúng trong các loại generic lồng nhau trông giống như thế này:

var list = new List<List<String>>(); 
IEnumerable<IEnumerable<object>> z = list; 

tôi có thể gán Danh sách Danh sách chuỗi để IEnumerable của IEnumerables của các đối tượng, đó là hiệp phương sai. Để biết thêm thông tin, hãy xem Covariance and Contravariance FAQ.

Các vấn đề liên quan