我不明白为什么下面的“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<> 来使 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;
我可以将字符串列表的列表分配给对象的 IEnumerable 的 IEnumerable,这就是协方差。 有关更多信息,请查看协方差和逆变常见问题解答。