.net为什么无法从int []转换为object []

use*_*098 2 .net boxing object

我有以下方法

private void AM(object[] x)
{
}
Run Code Online (Sandbox Code Playgroud)

当我们这样称呼时:

int[] x = new int[1];
AM(x);
Run Code Online (Sandbox Code Playgroud)

我们得到一个编译错误,比如"无效参数","无法从int []转换为object []".

但是,如果我们有一个参数(对象y),我们可以将输入int作为输入参数.

我的问题是:为什么微软以不同的方式设计它们?

And*_*per 8

int(值类型)传递给带有object(引用类型)参数的方法时,会在堆上创建一个新对象,并将其值int复制到该对象中.然后将对象(盒装int)的引用传递给方法参数.

int[]并且object[]都是数组,但它们具有非常不同的元素类型.作为数组,它们都是引用类型,因此采用object[]参数的方法期望引用对象数组.对一组int的引用是非常不同的.

因为int是一个值类型,所以没有简单的方法可以将引用int[]转换为引用object[]而不迭代整个int[]并装箱每个元素.就时间和内存而言,这可能是一项昂贵的操作,编译器不会自动为您执行此操作.


nun*_*cal 5

只有引用类型的数组可以分配给其他引用类型(如对象)的数组。由于 int 是值类型,因此您不能这样做。

这称为数组协方差

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