T defaultValue = default(T); // 型別參數專用
int i = default(int); // 也可用於具體型別
// 執行期語意:
// 參考型別 → null
// 值型別 → 全零位元模式 (0, false, 0.0, 等)
// 有 class 約束或為基本型別時為編譯期常數
// 型別參數作為 new 運算元需滿足:
// 1. 引數清單為空
// 2. 型別參數有 new() 約束
public T Create<T>() where T : new() {
return new T(); // 呼叫無參建構子
}
Type t1 = typeof(T); // 型別參數 → 執行期綁定型別的 Type 物件
Type t2 = typeof(List<List<T>>); // 構造型別也支援
// 錯誤:typeof 需具體型別引數
// Type t = typeof(Dictionary<,>); // 開放泛型型別不可用
// 有 class 約束時可直接比較
void Check<T>(T x) where T : class {
if (x == null) ... // 允許
}
// 無約束型別參數也允許 == null
// 執行期若 T 為值型別 → 永遠 false (經裝箱比較)
// is:開放型別執行期動態檢查
bool b = obj is T; // T 為開放型別時總是執行期檢查
// as:需 class 約束 (因可能回傳 null)
T Cast<T>(object o) where T : class {
return o as T; // 允許
}
// T 無約束時錯誤:值型別不可為 null
// throw:需 Exception 或衍生類別為 class 約束
void Throw<T>(T e) where T : Exception {
throw e; // 允許
}
// catch:同樣需 Exception 約束
try { } catch (T e) where T : Exception { }
// lock:允許型別參數表達式,值型別時無效 (裝箱產生新物件)
void Lock<T>(T obj) { lock (obj) { } }
// using:需 IDisposable 約束
void Use<T>(T resource) where T : IDisposable {
using (resource) { }
}
// foreach:支援 IEnumerable<T> 介面
foreach (T item in collection) // collection 實作 IEnumerable<T>
// 編譯器展開為 GetEnumerator/MoveNext/Current/Dispose 模式
名稱解析優先順序:
開放型別名稱(如 List<>)僅允許於特定語境(typeof、基類、約束等)。
object 成員this.x 隱含)為解決 List<List<int>> 中 >> 被詞法分析為右移運算子的問題:
>> 和 >>= 標記right-shift / right-shift-assignment 產生right-shift: '>' '>' (中間不允許任何字元,含空白)shift-expression、assignment-operator、overloadable-binary-operator結果:List<List<int>> 可直接編寫無需空格,a >> b 仍正常運作。
C# 2.0 泛型規範涵蓋:型別參數宣告、約束、構造型別、靜態/執行期語意、成員查找、多載解析、型別推斷、運算式擴充、陳述句支援、詞法調整。核心設計目標:型別安全、效能 (避免裝箱)、表達力、向後相容。