问题:为什么我不能Array of Integers
添加List<Object>
?
关注帖子:
do-value-types-integer-decimal-boolean-etc-inherit-from-object
how-do-valuetypes-derive-from-object-referencetype-and-still-be-valuetypes
我理解以下结构:
Integer => Inherits => System.ValueType => Inherits => System.Object
然后,当我执行以下操作时,为什么会出现错误:
List<object> myObjects = new List<object>();
myObjects.AddRange(IntegerArray.ToList());
给定错误:
cannot convert from 'System.Collections.Generic.List<int>' to
'System.Collections.Generic.IEnumerable<object>
这个有用:
List<int> myObjects = new List<int>();
myObjects.AddRange(IntegerArray.ToList());
答案 0 :(得分:4)
问题在于,正如错误消息所示,AddRange期望IEnumerable<object>
并且您传递IEnumerable<int>
。 'int'派生自object的事实并不意味着IEnumerable<int>
派生自IEnumerable<object>
。如果你这样做,那么它将起作用,因为你将使用正确的类型:
myObjects.AddRange(IntegerArray.Cast<object>());
答案 1 :(得分:2)
您必须明确说明如何使用ConvertAll将这些类型相互转换,如下所述:convert a list of objects from one type to another using lambda expression。
优点是可以转换任何类型。
另请查看contravariance以解释原因:List<Type1>
无法投放到List<Type2>
。
答案 2 :(得分:1)
您是否尝试过投射?
List<object> myObjects = new List<object>();
myObjects.AddRange(IntegerArray.ToList().Cast<object>());
答案 3 :(得分:1)
因为您没有将数组添加到List<object>
,而是尝试单独添加数组中的每个元素。
你当然可以这样做,这就是问题标题对我的意思:
List<object> myObjects = new List<object>();
myObjects.Add(new[] { 1, 2, 3 });
但是,您的代码会讲述一个不同的故事,并且由于AddRange
与您用于传递给它的类型之间的签名不兼容而失败。如果您有int[]
并希望将其内容分别添加到列表中,请使用Cast
:
myObjects.AddRange((new[] { 1, 2, 3 }).Cast<object>());
答案 4 :(得分:1)
在集合/泛型级别的C#中不允许使用Co / Contravariance。
即将List<int>
分配给List<object>
答案 5 :(得分:0)
int不是对象类型,而是原始类型。 因此,要将其转换为对象,首先需要将其转换为整数,它是包装器 类,然后将其转换为对象。
此外,此代码需要两次转换。 首先从int到Integer。然后整数到对象,这不能隐式完成。 隐式类型转换只能由编译器执行一次。因此,需要在对象类型中进行显式类型转换。