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

Visual Studio 2010 / .NET 4.0:泛型委派共變與反變完整範例

     編輯:關於.NET

概念定義

  • 共變:可使用比原指定衍生程度「更大」的型別(如衍生類別代替基底類別)。
  • 反變:可使用比原指定衍生程度「更小」的型別(如基底類別代替衍生類別)。

.NET 4.0 起,C# 與 VB 支援泛型介面與委派的共變/反變,允許隱式轉換泛型型別參數。宣告為共變/反變的泛型介面或委派稱為「變體」。

範例架構

public interface IColor { }
public class Red : IColor { }
public class Blue : IColor { }

委派宣告與核心邏輯

public class ColorDemo
{
    // 共變委派:out T 表示 T 只作為傳回型別
    private delegate T CovarianceDelegate();

    // 反變委派:in T 表示 T 只作為參數型別
    private delegate void ContravarianceDelegate(T color);

    private static string colorInfo;

    public void CoreMethod()
    {
        // === 共變示範 ===
        CovarianceDelegate a1 = ColorMethod;  // 傳回 IColor
        a1.Invoke();
        CovarianceDelegate a2 = RedMethod;       // 傳回 Red (更衍生)
        a2.Invoke();
        a1 = a2;  // 隱式轉換:Red → IColor (共變)
        a1.Invoke();

        // === 反變示範 ===
        ContravarianceDelegate b1 = BlueMethod;   // 參數 Blue
        b1.Invoke(new Blue());
        ContravarianceDelegate b2 = ColorMethod; // 參數 IColor (較不衍生)
        b2.Invoke(new Red());
        b1 = b2;  // 隱式轉換:IColor → Blue (反變)
        b1.Invoke(new Blue());
    }

    // 實作方法
    private IColor ColorMethod() { colorInfo = "無色"; Console.WriteLine(colorInfo); return null; }
    private void ColorMethod(IColor color) { colorInfo = "無色"; Console.WriteLine(colorInfo); }
    private Red RedMethod() { colorInfo = "紅色"; Console.WriteLine(colorInfo); return new Red(); }
    private void BlueMethod(Blue blue) { colorInfo = "藍色"; Console.WriteLine(colorInfo); }
}

執行結果

無色
紅色
紅色
藍色
無色
藍色

執行結果截圖

關鍵規則總結

關鍵字位置意義型別轉換方向
out傳回值共變衍生 → 基底 (安全)
in參數反變基底 → 衍生 (安全)
  • out T:T 僅能出現在傳回型別,不能作為參數。
  • in T:T 僅能出現在參數型別,不能作為傳回值。
  • 非泛型委派亦支援方法簽名比對時的共變/反變。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved