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