协方差行为中的数组对象[]

时间:2015-05-28 14:59:25

标签: c# covariance

I had a compile error while assinging int[] to object[](问题不是我的)。

接受的答案表明那是因为数组协方差(请为了更好的理解而阅读问题和答案)。

现在我的情况是,虽然我无法将int[]分配给object[],因为int是值类型(struct)我想知道为什么我现在可以这样做:

var arrayOfObjects = new object[] { 58, 58, 78 };// it accepts values types as initializers!

如果我正在为数组对象初始化值类型,为什么会这样?不应该互惠不接受价值类型吗?

3 个答案:

答案 0 :(得分:7)

因为您(隐式)将一个又一个项目投射到object。您没有为int[]变量分配object[]数组 - 您正在从单个object[]值创建int变量(这些变量会被隐式强制转换和装箱)。< / p>

要在没有数组初始值设定项的情况下显示:

object[] objarr = new object[1];
objarr[0] = 42; // Fine, translates basically into objarr[0] = (object)42;

int[] intarr = new int[1];
intarr[0] = 42; // Also fine

objarr = intarr; // No can do!

答案 1 :(得分:2)

在这里,您没有构建int[],整数被装入对象,而您正在构建object[]。你也可以装其他东西:

var arrayOfObjects = new object[] { true, "false", 1, 10, new StringBuilder() }

答案 2 :(得分:1)

要从编译器的角度完成观点,请给出以下声明:

void Main()
{
    object[] or = new object[] { 1, 2 };
}

这是编译器发出的IL:

IL_0001:  ldc.i4.2    
IL_0002:  newarr      System.Object
IL_0007:  stloc.1     // System.Object[]
IL_0008:  ldloc.1     // System.Object[]
IL_0009:  ldc.i4.0    
IL_000A:  ldc.i4.1    
IL_000B:  box         System.Int32
IL_0010:  stelem.ref  
IL_0011:  ldloc.1     // System.Object[]
IL_0012:  ldc.i4.1    
IL_0013:  ldc.i4.2    
IL_0014:  box         System.Int32
IL_0019:  stelem.ref  
IL_001A:  ldloc.1     // System.Object[]
IL_001B:  stloc.0     // or
IL_001C:  ret      

编译器获取值,对值类型(box)执行int操作,然后调用stelem.ref,它将替换所提供索引处的元素值。一维数组,其ref(类型O)值被压入堆栈。