首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 4.0 泛型協變與逆變深度解析(三):陣列的協變與逆變行為

     編輯:關於C語言

陣列參數的協變性

參考型別陣列可視為協變: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# 保留陣列協變性的歷史代價,泛型集合選擇不變性避免此問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved