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

C# 3.0 Lambda 運算式深度解析:語法、型別推斷、轉換規則與多載解析

     編輯:關於C語言

從匿名方法到 Lambda:語法演進

C# 2.0 匿名方法語法冗長,Lambda 運算式(=>)提供函數式風格的簡潔語法:

// C# 2.0 匿名方法
delegate(int x) { return x + 1; }

// C# 3.0 Lambda
x => x + 1;                    // 隱含型別,運算式本體
x => { return x + 1; }         // 區塊本體
(int x) => x + 1;              // 顯式型別
(x, y) => x * y;               // 多參數
() => Console.WriteLine();     // 無參數

Lambda 參數型別推斷規則

  • 顯式型別:參數清單完整指定型別,編譯器驗證一致性
  • 隱含型別:參數型別從目標委派型別推斷(需有目標型別語境)
  • 單一隱含型別參數可省略括號:x => x + 1

Lambda 轉換目標:委派 vs 運算式樹

目標委派類型Expression<TDelegate>
結果可執行程式碼(IL)資料結構(記憶體中樹狀圖)
用途執行邏輯分析、轉譯、遠端執行
轉換條件相容委派簽名運算式本體 Lambda(無區塊本體)
Func<int, int> f = x => x + 1;              // 委派
Expression<Func<int, int>> e = x => x + 1; // 運算式樹

委派相容性檢查規則

Lambda L 可轉換為委派 D 需滿足:

  1. 參數數量相同
  2. 若 L 顯式型別 → D 參數型別/修飾詞須完全一致
  3. 若 L 隱含型別 → D 不可有 ref/out 參數
  4. 回傳型別相容性:
    • D 為 void:L 運算式本體需為合法 statement-expression;區塊本體不可有帶運算式的 return
    • D 非 void:L 運算式本體需隱含轉換為 D 回傳型別;區塊本體需所有路徑 return 且運算式可轉換

泛型方法型別推斷與 Lambda

Lambda 參與泛型方法型別推斷的「資訊流動」:

static Z F<X, Y, Z>(X value, Func<X, Y> f1, Func<Y, Z> f2) 
    => f2(f1(value));

double seconds = F("1:15:30", s => TimeSpan.Parse(s), t => t.TotalSeconds);
// 推斷流程:
// 1. "1:15:30" → X = string
// 2. s: string → TimeSpan.Parse(s) → Y = TimeSpan
// 3. t: TimeSpan → t.TotalSeconds → Z = double

多載解析中的 Lambda 優先序

當多個多載僅回傳型別不同時,Lambda 的推斷回傳型別決定最佳匹配:

class ItemList<T> {
    public int Sum(Func<T, int> selector) { ... }
    public double Sum(Func<T, double> selector) { }
}

var details = new ItemList<Detail>();
int totalUnits = details.Sum(d => d.UnitCount);           // 推斷 int → 呼叫 int 版本
double total = details.Sum(d => d.UnitPrice * d.UnitCount); // 推斷 double → 呼叫 double 版本

規則:若 Lambda 推斷回傳型別 R1 隱含轉換至 D1 回傳型別優於轉換至 D2,則 D1 勝出。

Lambda 的額外能力(超越匿名方法)

  • 參數型別推斷(匿名方法必須顯式宣告)
  • 本體可為運算式(匿名方法僅限區塊)
  • 參與泛型型別推斷與多載解析
  • 運算式本體可轉換為運算式樹

Lambda 運算式是 C# 邁向函數式程式設計的關鍵基石,掌握其型別系統互動機制,能讓你寫出更簡潔、更具表達力的程式碼。

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