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!
如果我正在为数组对象初始化值类型,为什么会这样?不应该互惠不接受价值类型吗?
答案 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)值被压入堆栈。