C# 4 的协变支持泛型嵌套吗?

问题描述 投票:0回答:2

我不明白为什么下面的“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 工作。)

c# .net c#-4.0 covariance contravariance
2个回答
8
投票

“z”在 C# 4.0 中很好,

IEnumerable<T>
是协变的。
List<T>
然而不是,你不能让“y”工作。

直观地说,如果是的话,这将是有效的:

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

这违背了“列表”只能包含

List<int>
元素的承诺。


2
投票

你在这里犯了几个错误。 首先,值类型不支持协变和逆变,因此无论您尝试使用“int”做什么都行不通。

其次,检查嵌套泛型类型差异的有效示例看起来更像是这样的:

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

我可以将字符串列表的列表分配给对象的 IEnumerable 的 IEnumerable,这就是协方差。 有关更多信息,请查看协方差和逆变常见问题解答

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.