将 Integer[] 添加到 list
本文关键字:list Object 添加 Integer | 更新日期: 2023-09-27 17:56:01
问题:为什么我不能在List<Object>
中添加Array of Integers
?
以下帖子:
do-value-types-integer-十进制-布尔值-etc-inherit-from-object
如何做值类型派生自对象引用类型和仍然是值类型
我了解以下结构:
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());
问题是,正如错误消息所暗示的那样,AddRange 期望一个IEnumerable<object>
,而您正在传递它一个IEnumerable<int>
。 "int"派生自宾语并不意味着IEnumerable<int>
派生自IEnumerable<object>
。 如果您这样做,那么它将起作用,因为您将使用正确的类型:
myObjects.AddRange(IntegerArray.Cast<object>());
您必须明确说明如何通过例如使用 ConvertAll 将这些类型相互转换,如下所述: 使用 lambda 表达式将对象列表从一种类型转换为另一种类型。
优点是可以转换任何类型的类型。
还要寻找逆变来解释为什么会这样:List<Type1>
不能投射到List<Type2>
。
你试过选角吗?
List<object> myObjects = new List<object>();
myObjects.AddRange(IntegerArray.ToList().Cast<object>());
因为您不是在向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>());
Co/Contravariance 在集合/泛型级别不允许在 C# 中使用。即将List<int>
分配给List<object>
int 不是对象类型,而是基元类型。 所以要把它转换为对象,首先你需要把它转换成整数,它是包装器 类,然后将其转换为对象。
此外,此代码需要两次类型转换。 首先从 int 到 Integer。然后整数到对象,这不能隐式完成。 编译器只能执行一次隐式类型转换。因此,它需要在对象类型中进行显式类型转换。