2013-07-09 61 views
4

爲什麼會有這樣的法律,鑄造int數組到對象數組

string[] arr = new string[5]; 
Object[] arr2 = arr; 

但是,這是一個編譯時錯誤,

int[] arr = new int[5]; 
Object[] arr2 = arr; 

不是整型和字符串無論是從Object派生?它是一種ValueType的東西嗎?如果是這樣,爲什麼這樣呢?

+0

我相信答案是一個字符串不是一個原始類型,而一個int是一個原始類型。 – aikeru

+0

值類型是我相信正確的詞..用Int32做這個仍然會產生編譯錯誤。 – countunique

+0

呃...我不認爲Int32有什麼不同?不是「int」和「float」只是C#關鍵字,但Int32和Int64是「CLR」erm-identifier - 對他們來說? :) – aikeru

回答

2

C#語言只爲參考類型的數組提供協方差。這被記載on MSDN

對於任何兩個引用類型A和B,如果隱式引用轉換(第6.1.4節)或顯式引用轉換(第6.2.3節)從A存在於B,則從陣列類型A [R]到陣列類型B [R]也存在相同的參考轉換,其中R是任何給定的秩指定符(但對於兩種陣列類型都是相同的)。這種關係被稱爲陣列協方差。

在你的第二個例子,你用System.Int32類型,不引用類型的數組,所以數組協方差支持不適用。參考類型的核心是所有存儲引用數組,其中引用都是相同的大小。值類型可以是任何大小,因此不能保證數組元素的大小相同,這可以防止它正常工作。

3

這叫做unsafe array covariance

它只適用於參考類型的數組。

值類型的數組是一個物理上不同的大小,所以這是行不通的。