對於任意兩個「引用類型」A和B,若是存在從A到B的隱式引用轉換或顯式引用轉換,則也必定存在從數組類型A[R]到數組類型B[R]的相同的引用轉換,其中R能夠是任何給定的「秩說明符」,可是這兩個數組類型必須使用相同的R,這種關係稱爲數組協方差。具體來講,數組協方差就是數組類型A[R]的值實際上多是對數組類型B[R]的實例的引用(若是存在從B到A的隱式引用轉換的話)。數組
因爲存在數組協方差,對引用類型數組的元素的賦值操做會包括一個運行時檢查,以確保正在賦給數組元素的值確實是容許的類型。對象
例如:
class Test
{
static void Fill(object[] array, int index, int count, object value) {
for (int i = index; i < index + count; i++) array[i] = value;
}
static void Main() {
string[] strings = new string[100];
Fill(strings, 0, 100, "Undefined");
Fill(strings, 0, 10, null);
Fill(strings, 90, 10, 0);
}
}string
Fill方法中對array[i]的賦值隱式地包括一個運行時檢查,它確保由value引用的對象是null或者是與array的實際元素類型兼容的類型的實例。在Main中,Fill的前兩個調用成功了,可是在第三個調用中,當執行對array[i]的第一次賦值時會引起System.ArrayTypeMismatchException。發生此異常是由於裝箱的int類型不能存儲於string數組中。io
具體來講,數組協方差不能延伸到「值類型」的數組。例如,不存在容許將int[]看成object[]來處理的轉換。class