2012-07-27 75 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 [] 視爲對象[]的轉換。