object 型別集合三大缺點:
stack.Push(new Node1()); Node2 n = (Node2)stack.Pop(); 編譯通過,執行期拋 InvalidCastException。
// 泛型堆疊
public class Stack
{
private T[] items;
public T Pop() => items[--top];
public void Push(T item) => items[top++] = item;
}
// 使用
var intStack = new Stack();
intStack.Push(10);
// intStack.Push("abc"); // 編譯錯誤,型別安全
var strStack = new Stack();
strStack.Push("hello");
T 為佔位符。Stack),產生專屬機器碼(Stack 專用版本)。Stack 與 Stack 無繼承關係,靜態成員互不共享。
public class Repository
where T : class, IEntity, new() // 參考型別、實作介面、有無參建構子
where TKey : IEquatable // 實值/參考型別皆可,需實作介面
{
public T Create() => new T(); // 需 new() 約束
public bool Exists(TKey id) => ...; // 需 IEquatable 比較
}
每個封閉型別獨立觸發:
public class Demo
{
public void M(T a, int b) { } // 泛型方法 1
public void M(int a, T b) { } // 泛型方法 2
public void M(int a, int b) { } // 一般方法
}
// Demo m = new Demo();
// m.M(1, 2); // 呼叫一般方法 (優先)
// m.M(1, "x"); // 呼叫 M(int, T) -> T=string
原則:**一般方法優先 > 具體型別匹配 > 泛型推斷**。
public delegate TResult Func(T arg); (協變/逆變)泛型以優雅語法實現「演算法與資料結構與型別分離」,大幅提升效能、安全性與複用性。C# 未來版本將持續擴展(如預設介面方法、泛型數學介面)。