2010-04-21 76 views
5

我不明白爲什麼'x'低於轉換,但是'y'和'z'不是。C#4的協方差是否支持泛型嵌套?

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

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

新的協方差特徵是否不適用泛型的泛型或我做錯了什麼? (我想避免使用.Cast <>使y和z工作。)

回答

7

「z」在C#4.0中很好,IEnumerable<T>是協變的。然而,List<T>不是,你不能讓「y」工作。

直觀地說,如果它是那麼這將是有效的:

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

打破了承諾,「列表」只能包含List<int>元素。

+0

好的一部分問題是'z'不適合我,因爲我仍然瞄準3.5。哎呀。感謝有關'你'不工作的解釋,這是有道理的。 – scobi 2010-04-21 23:08:17

1

你在這裏犯了幾個錯誤。 首先,值類型不支持協方差和反變量,所以無論您嘗試使用「int」都無效。

其次,有效的例子檢查嵌套泛型類型差異看起來更像是這樣的:

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

我可以將字符串列表清單對象的IEnumerables的IEnumerable的,這是協方差。 欲瞭解更多信息,請查看Covariance and Contravariance FAQ