參考型別陣列可視為協變:D[] 傳給 B[] 參數合法。值型別陣列(如 int[])則不可。
void PrintCollection(object[] collection)
{
foreach (object o in collection) Console.WriteLine(o);
}
D[] dArray = new D[3];
PrintCollection(dArray); // 合法
方法內寫入基類別實例(new D2())編譯通過,但若實際陣列為 D[] 則執行期失敗。
class B { public override string ToString() => "B"; }
class D : B { public override string ToString() => "D"; }
class D2 : B { public override string ToString() => "D2"; }
void DestroyCollection(B[] storage)
{
try
{
for (int i = 0; i < storage.Length; i++) storage[i] = new D2();
}
catch (ArrayTypeMismatchException)
{
Console.WriteLine("ArrayTypeMismatch");
}
}
D[] array = new D[10]; // 填入 D
DestroyCollection(array); // 拋出 ArrayTypeMismatchException
陣列協變/逆變在「讀取」時安全,「寫入」時不安全。這是 C# 保留陣列協變性的歷史代價,泛型集合選擇不變性避免此問題。