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

C# 2.0 泛型規範完結篇:運算式、陳述句、查找規則與右移語法變更

     編輯:關於C語言

泛型相關運算式與陳述句修改

default 值運算式

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();  // 呼叫無參建構子
}

typeof 運算子

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 / as 運算子

// 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 / using / foreach 陳述句

// 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 模式

名稱查找規則修訂

命名空間與型別名稱

名稱解析優先順序:

  1. 泛型方法型別參數
  2. 外層型別宣告的型別參數
  3. 外層型別的巢狀型別成員
  4. 命名空間層級:using 別名 → using 命名空間導入型別 → 全域命名空間

開放型別名稱(如 List<>)僅允許於特定語境(typeof、基類、約束等)。

成員查找

  • 型別參數成員 = 其約束介面/類別成員聯集 + object 成員
  • 構造型別成員 = 替換型別引數後的成員集合
  • 隱藏規則:衍生成員隱藏基底同名成員,介面成員被類別成員隱藏

簡單名稱與成員存取

  • 區域變數/參數優先
  • 泛型方法型別參數
  • 外層型別型別參數
  • 外層型別實例成員 (this.x 隱含)
  • 命名空間/型別名稱 (using 導入)

方法呼叫與型別推斷

  • 候選方法集合建構:非泛型直接匹配、泛型嘗試型別推斷
  • 推斷成功且適用 → 候選
  • 移除基底類別中被隱藏的方法
  • 多載解析選最佳方法,再驗證約束滿足

委派建立運算式

  • 方法群組 → 單一匹配方法 (參數相容、型別推斷、無多載解析)
  • 委派值 → 型別相容即可

右移運算子語法變更

為解決 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 泛型規範涵蓋:型別參數宣告、約束、構造型別、靜態/執行期語意、成員查找、多載解析、型別推斷、運算式擴充、陳述句支援、詞法調整。核心設計目標:型別安全、效能 (避免裝箱)、表達力、向後相容。

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