我不明白爲什麼'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工作。)
我不明白爲什麼'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工作。)
「z」在C#4.0中很好,IEnumerable<T>
是協變的。然而,List<T>
不是,你不能讓「y」工作。
直觀地說,如果它是那麼這將是有效的:
List<IEnumerable<int>> y = list
y.Add(new Stack<int>());
打破了承諾,「列表」只能包含List<int>
元素。
你在這裏犯了幾個錯誤。 首先,值類型不支持協方差和反變量,所以無論您嘗試使用「int」都無效。
其次,有效的例子檢查嵌套泛型類型差異看起來更像是這樣的:
var list = new List<List<String>>();
IEnumerable<IEnumerable<object>> z = list;
我可以將字符串列表清單對象的IEnumerables的IEnumerable的,這是協方差。 欲瞭解更多信息,請查看Covariance and Contravariance FAQ。
好的一部分問題是'z'不適合我,因爲我仍然瞄準3.5。哎呀。感謝有關'你'不工作的解釋,這是有道理的。 – scobi 2010-04-21 23:08:17