为什么我不能将List <int>分配给.NET 4.0中的IEnumerable <object>

Onl*_*esh 11 ienumerable .net-4.0 covariance value-type

我试着这样做:

IEnumerable<object> ids = new List<string>() { "0001", "0002", "0003" };
Run Code Online (Sandbox Code Playgroud)

它很棒!

但是当我尝试这样做时:

IEnumerable<object> intIds = new List<System.Int32>() { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

Visual Studio告诉我:不能将类型'System.Collections.Generic.List'隐式转换为'System.Collections.Generic.IEnumerable'.存在显式转换(您是否错过了演员?)

这是为什么?

Jon*_*eet 6

简单地说:.NET 4中的泛型差异不支持作为值类型的类型参数的方差.

它可以用于引用类型的原因是,一旦CLR确定它知道通用转换是安全的,它就可以以相同的方式处理所有引用值 - 它们在内部具有相同的表示.如果您知道它肯定是对字符串的引用,则不需要实际转换将string引用转换为object引用,反之亦然 - 它基本上是相同的位.因此,生成的本机代码可以将引用视为引用,并且知道围绕方差的规则已经保证在类型安全级别上不会发生任何讨厌,并且不对值本身执行任何转换.

不是真值类型,其中所述转换不是一个"引用转换"为引用类型(即,表示保留的一个).这就是为什么你不能IEnumerable<XName> names = new List<string>();顺便写...


Ry-*_*Ry- 5

int是一个值类型,只能装箱object- 它不会继承object.既然你正在使用一个IEnumerable<object>,这应该工作:

IEnumerable intIds = new List<int>() { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)