将Integer []添加到列表<object> </object>

时间:2014-04-02 09:09:44

标签: c# .net list

问题:为什么我不能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());

6 个答案:

答案 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。然后整数到对象,这不能隐式完成。 隐式类型转换只能由编译器执行一次。因此,需要在对象类型中进行显式类型转换。