【问题标题】:Add Integer[] to list<Object>将 Integer[] 添加到 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());

【问题讨论】:

标签: c# .net list


【解决方案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 类型中进行显式类型转换。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-17
          • 2015-10-29
          • 1970-01-01
          • 2021-01-21
          • 2016-09-28
          • 2022-12-07
          • 2019-10-13
          • 2015-05-01
          相关资源
          最近更新 更多