我不明白为什么'x'会转换,但'y'和'z'不会转换。
var list = new List<List<int>>();
IEnumerable<List<int>> x = list;
List<IEnumerable<int>> y = list;
IEnumerable<IEnumerable<int>> z = list;
新的协方差功能是否不适用于泛型的泛型,还是我做错了? (我想避免使用.Cast&lt;&gt;来使y和z工作。)
答案 0 :(得分:7)
“z”在C#4.0中很好,IEnumerable<T>
是协变的。然而,List<T>
不是,你不能让“y”工作。
直观地说,如果是,那么这将是有效的:
List<IEnumerable<int>> y = list
y.Add(new Stack<int>());
这违反了“list”只能包含List<int>
元素的承诺。
答案 1 :(得分:1)
你在这里犯了几个错误。 首先,值类型不支持协方差和逆变,因此无论你尝试用“int”做什么都行不通。
其次,检查嵌套泛型类型中的方差的有效示例看起来更像是:
var list = new List<List<String>>();
IEnumerable<IEnumerable<object>> z = list;
我可以将字符串列表的列表分配给IEnumerable对象的IEnumerable,这是协方差。 有关详细信息,请查看Covariance and Contravariance FAQ。