当我编写此代码时,它允许我
IEnumerable<object> creator = new List<string>();
但是当我写
IEnumerable<object> creator = new List<int>();
它显示编译时错误:
错误CS0266无法隐式转换类型 'System.Collections.Generic.List'到 'System.Collections.Generic.IEnumerable'。一个明确的 转换存在(您是否缺少演员表?)
我不知道为什么会这样。
答案 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 object
。 struct usage guide中也提到了它。这不是不是值类型不变的原因!
答案 1 :(得分:-1)
我相信这是因为int是一种值类型。尽管int最终确实是从对象继承的,但是int不能继承自; 您可以与此比较它们的基本类型:
Console.WriteLine(10.GetType().BaseType.Name);
Console.WriteLine("".GetType().BaseType.Name);