C#4的协方差是否支持泛型的嵌套?

时间:2010-04-21 16:09:00

标签: c# .net c#-4.0 covariance contravariance

我不明白为什么'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工作。)

2 个答案:

答案 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