将 Integer[] 添加到 list<Object>

Posted

技术标签:

【中文标题】将 Integer[] 添加到 list<Object>【英文标题】:Add Integer[] to list<Object> 【发布时间】:2014-05-13 10:45:30 【问题描述】:

问题:为什么我不能将Array of Integers 添加到List&lt;Object&gt;

关注帖子:

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&lt;object&gt;?对我来说似乎有点危险 Addrange 应该是 AddRange,首先 - 这显然不是你的真实代码...... 【参考方案1】:

问题在于,正如错误消息所暗示的那样,AddRange 期望 IEnumerable&lt;object&gt; 并且您将其传递给 IEnumerable&lt;int&gt;。 'int' 派生自 object 的事实并不意味着 IEnumerable&lt;int&gt; 派生自 IEnumerable&lt;object&gt;。如果您这样做,那么它将起作用,因为您将使用正确的类型:

myObjects.AddRange(IntegerArray.Cast<object>());

【讨论】:

甜蜜!我假设会发生隐式转换是不正确的。感谢您向我指出这一点!【参考方案2】:

您必须明确说明如何使用 ConvertAll 将这些类型相互转换,如下所述:convert a list of objects from one type to another using lambda expression。

优点是可以转换任何类型。

同时查找 contravariance 以解释原因:List&lt;Type1&gt; 不能转换为 List&lt;Type2&gt;

【讨论】:

【参考方案3】:

您尝试过投射吗?

List<object> myObjects = new List<object>();
myObjects.AddRange(IntegerArray.ToList().Cast<object>());

【讨论】:

@UlugbekUmirov,嗯。可能应该先测试 ;-) 感谢您指出这一点,我更新了我的答案以反映。【参考方案4】:

因为您没有将数组添加到List&lt;object&gt;,而是尝试单独添加数组中的每个元素

你当然可以这样做,这就是问题标题对我的理解:

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&lt;int&gt;分配给List&lt;object&gt;

【讨论】:

【参考方案6】:

int 不是对象类型,它是原始类型。 所以要将它转换为Object,首先你需要将它转换为Integer,它是包装器 类,然后将其转换为 Object。

此外,此代码需要进行两次类型转换。 首先从 int 到 Integer。然后整数到对象,这不能隐式完成。 隐式类型转换只能由编译器完成一次。所以它需要在 Object 类型中进行显式类型转换。

【讨论】:

以上是关于将 Integer[] 添加到 list<Object>的主要内容,如果未能解决你的问题,请参考以下文章

如何添加到 List<?扩展 Number> 数据结构?

如何将 map() 结果添加到列表 [重复]

将整数添加到 ArrayList<Integer>

将 List<List<Integer>> 转换为 int[][]

list去重

Leetcode18 4Sum