将int []转换为object []

Max*_*ich 3 c# clr

我遇到了一个问题:为什么它是不可能投int[]object[],如 object[] o = new int[] { 0, 1, 2 };

与此同时,我可以施展到刚刚object回归int[].

我很高兴听到深刻的答复.

spe*_*der 7

直接来自文档:

数组协方差特别不扩展到值类型的数组.例如,不存在允许将int []视为对象[]的转换.

整数或任何其他值类型的数组不是对象数组.值类型与引用类型具有不同的存储特征.一个(引用类型)对象数组包含一个对象引用列表(对象本身位于堆中),因此槽总是一个恒定的宽度.另一方面,值类型将它们的值直接存储在数组中,因此插槽可以是任何宽度.这使得两者之间的转换毫无意义.

这有点令人困惑,因为即使值类型是从System.Object派生的,它们的行为与引用类型的行为也大不相同,并且只有通过编译器和运行时对它们进行神奇的处理才能实现值类型的对象行为(例如装箱). ,它不会扩展到数组.

作为旁注,铸造阵列是一个很好的实践.我不会这样做.


dca*_*tro 1

A对于可转换为 type的 type 实例B,必须满足以下条件之一:

  1. 有从到 的隐式/显式转换;AB
  2. 存在等级关系。这种关系可以通过以下两种方式之一实现:
    1. 源自(例如A,)Bclass A : B {}
    2. 协变/逆变。C# 允许协方差:
      1. 引用类型数组 ( string[]> object[]) (*)
      2. 接口/委托中的泛型类型参数(IEnumerable<string>>IEnumerable<object>Func<string>> Func<object>
      3. 代表(string Method() {}可以分配给delegate object Del();

您无法强制转换int[]object[],因为以上条件都不成立。


(*) - 不过,您应该避免这种情况 - 数组协方差已被破坏,并且添加它只是为了让 CLR 支持类 Java 语言