为什么IEnumerable不等于list

时间:2019-07-05 08:05:58

标签: c#

当我编写此代码时,它允许我

IEnumerable<object> creator = new List<string>();

但是当我写

IEnumerable<object> creator = new List<int>();

它显示编译时错误

  

错误CS0266无法隐式转换类型   'System.Collections.Generic.List'到   'System.Collections.Generic.IEnumerable'。一个明确的   转换存在(您是否缺少演员表?)

我不知道为什么会这样。

2 个答案:

答案 0 :(得分:5)

那是因为value types do not support co-/contravariance

string是引用类型,因此可以正常工作。 int是一个值类型,所以不是。

但是,您可以将列表显式转换为带框的int列表:

IEnumerable<object> creator = listOfInts.Select(i => (object)i);

编辑:

与许多其他答案相反,值类型为do in fact inherit from objectstruct usage guide中也提到了它。这不是不是值类型不变的原因!

答案 1 :(得分:-1)

我相信这是因为int是一种值类型。尽管int最终确实是从对象继承的,但是int不能继承自; 您可以与此比较它们的基本类型:

Console.WriteLine(10.GetType().BaseType.Name);
        Console.WriteLine("".GetType().BaseType.Name);