ラムダ式 (=>) 演算子でラムダ式を定義する

=> トークンは、ラムダ演算子として、およびメンバー名の区切り記号として、および式本体定義のメンバー実装の 2 つの形式でサポートされます。

C# 言語リファレンスには、C# 言語の最新リリース バージョンが記載されています。 また、今後の言語リリースのパブリック プレビューの機能に関する初期ドキュメントも含まれています。

このドキュメントでは、言語の最後の 3 つのバージョンまたは現在のパブリック プレビューで最初に導入された機能を特定します。

ヒント

C# で機能が初めて導入された時期を確認するには、 C# 言語バージョン履歴に関する記事を参照してください。

ラムダ演算子

ラムダ式では、ラムダ演算子=>は、左側の入力パラメーターと右側のラムダ本体を分離します。

次の例では、 LINQ 機能とメソッド構文を使用して、ラムダ式の使用方法を示します。

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

ラムダ式の入力パラメーターは、コンパイル時に厳密に型指定されます。 前の例のように、コンパイラが入力パラメーターの型を推論する場合は、型宣言を省略できます。 入力パラメーターの型を指定する必要がある場合は、次の例に示すように、各パラメーターの型を指定する必要があります。

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

次の例は、入力パラメーターなしでラムダ式を定義する方法を示しています。

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

詳細については、「 ラムダ式」を参照してください。

式本体の定義

式本体の定義では、次の一般的な構文を使用します。

member => expression;

値を返すメンバーの場合、式の結果はメンバーの戻り値の型に暗黙的に変換できる必要があります。 voidメンバー、コンストラクター、ファイナライザー、またはsetinitadd、またはremoveアクセサーの場合、本文はステートメント式である必要があります。 ステートメント式には、代入、メソッド呼び出し、オブジェクトの作成、インクリメントまたはデクリメント操作、または await 式を指定できます。 その結果 (ある場合) は破棄されます。

次の例は、 Person.ToString メソッドの式本体の定義を示しています。

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;があります。 setまたはinitアクセサーには、フォームのset => statementExpression;またはinit => statementExpression;があります。 詳細については、「プロパティとインデクサー」を参照してください。
  • コンストラクターとファイナライザー: これらのメンバーには、フォーム C() => statementExpression; または ~C() => statementExpression;があります。 詳細については、「 コンストラクターファイナライザー」を参照してください。
  • イベント アクセサー:addまたはremoveアクセサーには、フォームのadd => statementExpression;またはremove => statementExpression;があります。 詳細については、「 イベント」を参照してください。

演算子のオーバーロード可能性

=>演算子をオーバーロードすることはできません。

C# 言語仕様

ラムダ演算子の詳細については、C# 言語仕様「匿名関数式」セクションを参照してください。

こちらもご覧ください