2012-07-27 71 views
2

我有以下方法.NET为什么不能从int []转换为对象[]

private void AM(object[] x) 
{ 
} 

当我们这样称呼它:

int[] x = new int[1]; 
AM(x); 

我们得到一个编译错误,像“无效参数”,“不能从int []转换为object []”。但是,如果我们有一个参数(对象y),我们可以将输入int作为输入参数。

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

+0

为什么你这样做了原型函数?这是你写的东西,可以改变吗? – 2012-07-27 03:30:09

回答

6

当传递一个int(值类型)与一个object(引用类型)参数的方法,是在堆和int的值创建新的对象被复制到其中。然后将该对象(盒装的int)的引用传递给方法参数。

int[]object[]都是数组,但它们具有非常不同的元素类型。作为数组,它们都是引用类型,因此采用object[]参数的方法需要引用一组对象。对一系列整数的引用是非常不同的。

由于int是值类型,有转向int[]基准成参考object[]不遍历整个int[]和拳击各元件没有简单的方法。就时间和内存而言,这可能是一项昂贵的操作,编译器不会自动为您执行。

2

与int数组相比,一个对象数组是完全不同的动物(正如您可以看到的那样)。但是,object []和int []都是对象,因此您可以将它们都转换为它们的原型类型(如在基元中),它是对象。

4

只有引用类型的数组可以被分配给其他引用类型的数组(如Object)。由于int是一个值类型,所以你不能这样做。

这被称为Array Covariance

阵列协方差特别不延伸到 值类型的阵列。例如,不存在允许将int [] 视为对象[]的转换。