ラムダ式と匿名関数を使用するときのエラーと警告

ラムダ式の宣言と使用法に関連するいくつかの "エラー" があります。

  • CS0748: ラムダ パラメーターの使用方法に一貫性がありません。パラメーター型はすべて明示的であるか、またはすべて暗黙的である必要があります。
  • CS1621: yield ステートメントは、匿名メソッドまたはラムダ式の内部では使用できません。
  • CS1628: inref、または out パラメーターは、匿名メソッド、ラムダ式、またはクエリ式の内部では使用できません。
  • CS1632: コントロールを匿名メソッドまたはラムダ式の本体外に出すことはできません。
  • CS1673: 構造体内の匿名メソッド、ラムダ式、およびクエリ式は、"this" のインスタンス メンバーにアクセスできません。
  • CS1686: ローカル variable またはそのメンバーは、アドレスを与えることも、匿名メソッドまたはラムダ式の内部で使用されることもできません。
  • CS1706: 式に匿名メソッドまたはラムダ式を含めることはできません。
  • CS8030: void に変換されデリゲートを返す匿名関数は、値を返すことができません。
  • CS8175: 匿名メソッド、ラムダ式、クエリ式内で ref ローカル変数は使用できません。
  • CS8916: ラムダ式での属性には、かっこで囲まれたパラメーター リストが必要です。
  • CS8971: ラムダ パラメーターに適用しても InterpolatedStringHandlerArgument は効果がありません。呼び出しサイトでは無視されます。
  • CS8975: コンテキスト キーワード var は、明示的なラムダ戻り値の型として使用できません。
  • CS9098: 暗黙的に型指定されたラムダ パラメーター "..." に既定値を指定することはできません。

さらに、ラムダ式の宣言と使用法に関連するいくつかの "警告" があります。

  • CS8971: ラムダ パラメーターに適用しても InterpolatedStringHandlerArgument は効果がありません。呼び出しサイトでは無視されます。
  • CS9099: 既定のパラメーター値がターゲット デリゲート型で一致しません。
  • CS9100: パラメーターにラムダの params 修飾子がありますが、ターゲット デリゲート型にはありません。

ラムダ式の構文の制限事項

ラムダ式と匿名メソッドでは、一部の C# 構文は禁止されています。 ラムダ式で無効なコンストラクトを使用すると、次のエラーが発生します。

  • CS1621: yield ステートメントは、匿名メソッドまたはラムダ式の内部では使用できません。
  • CS1628: inref、または out パラメーターは、匿名メソッド、ラムダ式、またはクエリ式の内部では使用できません。
  • CS1632: コントロールを匿名メソッドまたはラムダ式の本体外に出すことはできません。
  • CS1673: 構造体内の匿名メソッド、ラムダ式、およびクエリ式は、this のインスタンス メンバーにアクセスできません。
  • CS1686: ローカル variable またはそのメンバーは、アドレスを与えることも、匿名メソッドまたはラムダ式の内部で使用されることもできません。
  • CS8175: 匿名メソッド、ラムダ式、クエリ式内で ref ローカル変数は使用できません。

ラムダ式では、次のすべてのコンストラクトは許可されません。

  • yield ステートメント (yield return または yield break)
  • inref、または out パラメーターを持つメソッドの呼び出し
  • ref ローカル変数
  • breakgotocontinue ステートメント
  • thisstruct 型の場合の this アクセス
  • 属性コンストラクターのような別の式内の匿名メソッドまたはラムダ式。

これらのコンストラクトは、ラムダ式または匿名メソッドではどれも使用できません。 ローカル関数では、多くが使用できます。

さらに、補間された文字列ハンドラー型がラムダ パラメーターに適用された場合は、無視されます。 使用すると、次の警告が表示されます。

  • CS8971: ラムダ パラメーターに適用しても InterpolatedStringHandlerArgument は効果がありません。呼び出しサイトでは無視されます。

ラムダ式のパラメーターと戻り値

次のエラーは、パラメーター宣言に問題があることを示しています。

  • CS0748: ラムダ パラメーターの使用方法に一貫性がありません。パラメーター型はすべて明示的であるか、またはすべて暗黙的である必要があります。
  • CS9098: 暗黙的に型指定されたラムダ パラメーター "..." に既定値を指定することはできません。
  • CS8030: void に変換されデリゲートを返す匿名関数は、値を返すことができません。
  • CS8916: ラムダ式での属性には、かっこで囲まれたパラメーター リストが必要です。
  • CS8975: コンテキスト キーワード "var" は、明示的なラムダ戻り値の型として使用できません。

ラムダ式パラメーターは、次の規則に従っている必要があります。

  • ラムダ式に複数のパラメーターがある場合は、すべてのパラメーターを明示的に型指定するか、すべてのパラメーターを暗黙的に型指定する必要があります。
  • 既定値を持つすべてのラムダ パラメーターは、明示的に型指定する必要があります。
  • 属性をパラメーターに適用する場合は、パラメーター リストをかっこで囲む必要があります。

ラムダ式の戻り値の型は、次の規則に従っている必要があります。

  • 任意の値を返すラムダ式を、Action などのデリゲートを返す void に変換することはできません。
  • 戻り値の型は推論されるか、明示的な型です。 キーワード var を使用して宣言された戻り値の型は許可されません。

ラムダ式デリゲート型

  • CS9099: 警告: 既定のパラメーター値がターゲット デリゲート型で一致しません。

既定値を宣言するか、ラムダ式パラメーターを使用して params 修飾子を追加する場合に、デリゲート型が Func または Action 型のどれか 1 つではありません。 そうではなく、既定のパラメーター値または params 修飾子を含むカスタム型です。 次のコードは、既定のパラメーターを持つラムダ式を Action 型に割り当てているため、警告が生成されます。

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

エラーを修正するには、既定のパラメーターを削除するか、デリゲート型に暗黙的に型指定された変数を使用します。

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };