将 Integer[] 添加到 list<Object>
Posted
技术标签:
【中文标题】将 Integer[] 添加到 list<Object>【英文标题】:Add Integer[] to list<Object> 【发布时间】:2014-05-13 10:45:30 【问题描述】:问题:为什么我不能将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());
【问题讨论】:
查看这个:Why covariance and contravariance do not support value type 只是好奇,但为什么是list<object>
?对我来说似乎有点危险
Addrange
应该是 AddRange
,首先 - 这显然不是你的真实代码......
【参考方案1】:
问题在于,正如错误消息所暗示的那样,AddRange 期望 IEnumerable<object>
并且您将其传递给 IEnumerable<int>
。 'int' 派生自 object 的事实并不意味着 IEnumerable<int>
派生自 IEnumerable<object>
。如果您这样做,那么它将起作用,因为您将使用正确的类型:
myObjects.AddRange(IntegerArray.Cast<object>());
【讨论】:
甜蜜!我假设会发生隐式转换是不正确的。感谢您向我指出这一点!【参考方案2】:您必须明确说明如何使用 ConvertAll 将这些类型相互转换,如下所述:convert a list of objects from one type to another using lambda expression。
优点是可以转换任何类型。
同时查找 contravariance 以解释原因:List<Type1>
不能转换为 List<Type2>
。
【讨论】:
【参考方案3】:您尝试过投射吗?
List<object> myObjects = new List<object>();
myObjects.AddRange(IntegerArray.ToList().Cast<object>());
【讨论】:
@UlugbekUmirov,嗯。可能应该先测试 ;-) 感谢您指出这一点,我更新了我的答案以反映。【参考方案4】:因为您没有将数组添加到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>());
【讨论】:
【参考方案5】:C# 在集合/泛型级别不允许使用协方差。
即将List<int>
分配给List<object>
【讨论】:
【参考方案6】:int 不是对象类型,它是原始类型。 所以要将它转换为Object,首先你需要将它转换为Integer,它是包装器 类,然后将其转换为 Object。
此外,此代码需要进行两次类型转换。 首先从 int 到 Integer。然后整数到对象,这不能隐式完成。 隐式类型转换只能由编译器完成一次。所以它需要在 Object 类型中进行显式类型转换。
【讨论】:
以上是关于将 Integer[] 添加到 list<Object>的主要内容,如果未能解决你的问题,请参考以下文章