将 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());

将 Integer[] 添加到 list<Object>

问题是,正如错误消息所暗示的那样,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。然后整数到对象,这不能隐式完成。 编译器只能执行一次隐式类型转换。因此,它需要在对象类型中进行显式类型转换。

相关文章: