.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 僅能出現在參數型別,不能作為傳回值。