次の方法で共有


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

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

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

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

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

コンパイラは、次の 情報 メッセージも生成します。

  • CS9236: コンパイルするには、ラムダ式を少なくとも回数バインドする必要があります。明示的なパラメーター型を使用してラムダ式を宣言することを検討してください。または、包含メソッドの呼び出しがジェネリックの場合は、明示的な型引数の使用を検討してください。

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

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

  • CS1621: yield ステートメントは、匿名メソッドまたはラムダ式内では使用できません。
  • CS1628: 匿名メソッド、ラムダ式、またはクエリ式内で inref、または out パラメーターを使用できません。
  • CS1632: コントロールは、匿名メソッドまたはラムダ式の本体を残すことはできません。
  • CS1673: 構造体内の匿名メソッド、ラムダ式、クエリ式は、 thisのインスタンス メンバーにアクセスできません。
  • CS1686: ローカル変数またはそのメンバーは、アドレスを取得して匿名メソッドまたはラムダ式内で使用することはできません。
  • CS8175: 匿名メソッド、ラムダ式、またはクエリ式内で ref local を使用できません。

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

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

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

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

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

特定の式により、コンパイラは次の情報警告を出力します。

  • CS9236: コンパイルするには、ラムダ式を少なくとも回数バインドする必要があります。明示的なパラメーター型を使用してラムダ式を宣言することを検討してください。または、包含メソッドの呼び出しがジェネリックの場合は、明示的な型引数の使用を検討してください。

ラムダ式の複雑さと他のラムダ式の呼び出し方法は、コンパイラのパフォーマンスに悪影響を及ぼします。 その理由は、コンパイラはラムダ式を介してパラメーターと引数の型を推論する必要があり、潜在的な型には時間がかかるということです。

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

これらのエラーは、パラメーター宣言の問題を示しています。

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

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

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

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

  • 任意の値を返すラムダ式は、voidなどのデリゲートを返すActionに変換できません。
  • 戻り値の型は推論されるか、明示的な型です。 キーワード 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) => { };