C#4和#x27;s协方差是否支持泛型嵌套?

C#4和#x27;s协方差是否支持泛型嵌套?,c#,.net,c#-4.0,covariance,contravariance,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; var list=newlist(); IEnumerable

我不明白为什么下面的“x”会转换,但“y”和“z”不会

var list = new List<List<int>>();

IEnumerable<List<int>> x = list;
List<IEnumerable<int>> y = list;
IEnumerable<IEnumerable<int>> z = list;
var list=newlist();
IEnumerable x=列表;
列表y=列表;
IEnumerable z=列表;
新的协方差特性对泛型的泛型不起作用,还是我做错了什么?(我希望避免使用.Cast使y和z工作。)

在C#4.0中,“z”很好,
IEnumerable
是协变的<代码>列表不可用,但不能使“y”工作

直觉上,如果是这样的话,这是有效的:

List<IEnumerable<int>> y = list
y.Add(new Stack<int>());
List y=List
y、 添加(新堆栈());

这打破了“列表”只能包含
list
元素的承诺。

您在这里犯了几个错误。 首先,值类型不支持协方差和逆变,所以无论您尝试使用“int”做什么都不会起作用

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

var list = new List<List<String>>();
IEnumerable<IEnumerable<object>> z = list; 
var list=newlist();
IEnumerable z=列表;
我可以将字符串列表分配给对象的IEnumerable的IEnumerable,这是协方差。
要了解更多信息,请查看。

Ok问题的一部分是“z”对我不起作用,因为我的目标仍然是3.5。哎呀。谢谢你对“y”不起作用的解释,这是有道理的。