Lambda 運算式 (=>) 運算子會定義 Lambda 運算式

令牌 => 支援兩種形式:作為 λ 運算子,以及在 運算式主體定義中,作為連接成員名稱與成員實作的分隔符。

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

Lambda 運算子

Lambda 運算式中,Lambda 運算符 => 會將左側的輸入參數與右側的 Lambda 主體分隔開來。

下列範例使用 LINQ 功能搭配方法語法來示範 Lambda 表達式的使用方式:

string[] words = { "bot", "apple", "apricot" };
int minimalLength = words
  .Where(w => w.StartsWith("a"))
  .Min(w => w.Length);
Console.WriteLine(minimalLength);   // output: 5

int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (interim, next) => interim * next);
Console.WriteLine(product);   // output: 280

Lambda 表達式的輸入參數會在編譯階段進行強類型檢查。 當編譯器推斷輸入參數的類型時,如前例所示,你可以省略型別宣告。 如果你需要指定輸入參數的類型,必須為每個參數指定類型,如下範例所示:

int[] numbers = { 4, 7, 10 };
int product = numbers.Aggregate(1, (int interim, int next) => interim * next);
Console.WriteLine(product);   // output: 280

下列範例示範如何定義不含輸入參數的 Lambda 運算式:

Func<string> greet = () => "Hello, World!";
Console.WriteLine(greet());

如需詳細資訊,請參閱 Lambda 運算式

表達式主體定義

表達式主體定義使用以下一般語法:

member => expression;

對於回傳值的成員,該表達式的結果必須隱含可轉換為該成員的回傳類型。 對於 void 成員、建構子、終結子或 setinit、 、 addremove accessr,主體必須是 陳述式表達式。 陳述式可以是指派、方法調用、物件建立、遞增或遞減操作,或 await 是表達式。 其結果(若有)會被捨棄。

下列範例顯示一個方法的運算式主體定義:

public override string ToString() => $"{fname} {lname}".Trim();

這是下列方法定義的速記版本:

public override string ToString()
{
   return $"{fname} {lname}".Trim();
}

你可以對以下成員使用表達式主體定義:

  • 方法與局部功能: 回傳值的成員形式為 T M() => expression;。 成員 void 的形如 void M() => statementExpression;。 欲了解更多資訊,請參閱 方法局部函數
  • 營運商: 算符的形式 public static T operator +(T left, T right) => expression;為 。 如需詳細資訊,請參閱 運算元多載
  • 屬性與索引器: 唯讀屬性或索引器的形式 T P => expression; 為 或 T this[int i] => expression;。 你也可以用表達體來管理個別的存取器。 一個 get 附件的形式為 get => expression;。 A setinit accessr 的形式為 set => statementExpression;init => statementExpression;。 欲了解更多資訊,請參閱 屬性索引器
  • 製造商與終結者: 這些成員的型態 C() => statementExpression; 為 或 ~C() => statementExpression;。 更多資訊請參見 製造商終結者
  • 活動接入者: 一個 add or remove 的附錄具有形式 add => statementExpression; 為 或 remove => statementExpression;。 如需詳細資訊,請參閱 事件

運算子多載性

你不能讓操作員過載 =>

C# 語言規格

如需 Lambda 運算子的詳細資訊,請參閱 C# 語言規格匿名函式運算式一節。

另請參閱