いくつかの エラー は、 ラムダ式 と 匿名メソッドの宣言と使用に関連しています。
- CS0407: 'method' の戻り値の型が正しくありません。
- CS0428: メソッド グループ 'Identifier' を非デリゲート型 'type' に変換できません。メソッドを呼び出すつもりでしたか?
- CS0748: ラムダ パラメーターの使用法に一貫性がありません。パラメーターの型はすべて明示的であるか、すべて暗黙的である必要があります。
- CS0815: 暗黙的に型指定された変数に 'expression' を割り当てることはできません。
- CS0828: 匿名型プロパティに 'expression' を割り当てることはできません。
- CS0837: 'is' または 'as' 演算子の最初のオペランドは、ラムダ式、匿名メソッド、またはメソッド グループにすることはできません。
- CS1065: このコンテキストでは既定値は無効です。
- CS1621: yield ステートメントは、匿名メソッドまたはラムダ式内では使用できません。
- CS1628: 匿名メソッド、ラムダ式、またはクエリ式内で または パラメーターを使用できません。
- CS1632: コントロールは、匿名メソッドまたはラムダ式の本体を残すことはできません。
- CS1643: すべてのコード パスが型 'type' の匿名メソッドで値を返すわけではありません。
- CS1660: ラムダ式はデリゲート型ではないため、型 'type' に変換できません。
- CS1661: パラメーター型がデリゲート パラメーター型と一致しないため、匿名メソッド ブロックを型 'type' に変換できません。
- CS1662: ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、匿名メソッド ブロックを目的のデリゲート型に変換できません。
- CS1673: 構造体内の匿名メソッド、ラムダ式、およびクエリ式は、'this' のインスタンス メンバーにアクセスできません。
- CS1676: パラメーター 'number' は'keyword' キーワードで宣言する必要があります。
- CS1677: パラメーター 'number' を 'keyword' キーワードで宣言しないでください。
- CS1678: パラメーター 'number' は型 'type1' として宣言されていますが、'type2' にする必要があります。
- CS1686: ローカル変数またはそのメンバーは、アドレスを取得して匿名メソッドまたはラムダ式内で使用することはできません。
- CS1688: 1 つ以上の out パラメーターがあるため、パラメーター リストのない匿名メソッド ブロックをデリゲート型 'delegate' に変換できません。
- CS1706: 式に匿名メソッドまたはラムダ式を含めることはできません。
- CS1731: ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、式をデリゲートに変換できません。
- CS1732: パラメーターが必要とされています。
- CS1764: 匿名メソッド、ラムダ式、またはクエリ式内で固定ローカルを使用することはできません。
- CS8030: void 戻りデリゲートに変換された匿名関数は、値を返すことができません。
- CS8175: 匿名メソッド、ラムダ式、またはクエリ式内で ref local を使用できません。
- CS8820: 静的匿名関数に 'variable' への参照を含めることはできません。
- CS8821: 静的匿名関数には、'this' または 'base' への参照を含めることはできません。
- CS8916: ラムダ式の属性には、かっこで区切ったパラメーター リストが必要です。
- CS8917: デリゲート型を推論できませんでした。
- CS8934: 戻り値の型がデリゲートの戻り値の型と一致しないため、匿名メソッドを型 'type' に変換できません。
- CS8975: コンテキスト キーワード は、明示的なラムダ戻り値の型として使用できません。
- CS9098: 暗黙的に型指定されたラムダ パラメーター '...'は既定値を持つことができません。
さらに、ラムダ式の宣言と使用に関連するいくつかの 警告 があります。
- CS0467: メソッド 'method' と非メソッド 'non-method' の間のあいまいさ。メソッド グループの使用。
- CS1911: 匿名メソッド、ラムダ式、クエリ式、または反復子から 'base' キーワードを介してメンバーにアクセスすると、検証できないコードが生成されます。
- CS8971: InterpolatedStringHandlerArgument はラムダ パラメーターに適用しても効果がなく、呼び出しサイトでは無視されます。
- CS8974: メソッド グループ 'method' を非デリゲート型 'type' に変換します。メソッドを呼び出すつもりでしたか?
- CS9099: 既定のパラメーター値がターゲット デリゲート型と一致しません。
- CS9100: パラメーターにはラムダのパラメーター修飾子がありますが、ターゲット デリゲート型には含まれません。
コンパイラは、次の 情報 メッセージも生成します。
- CS9236: コンパイルするには、ラムダ式を少なくとも回数バインドする必要があります。明示的なパラメーター型を使用してラムダ式を宣言することを検討してください。または、包含メソッドの呼び出しがジェネリックの場合は、明示的な型引数の使用を検討してください。
ラムダ式の構文の制限事項
- CS0837: 演算子または演算子の最初のオペランドは、ラムダ式、匿名メソッド、またはメソッド グループにすることはできません。
- CS1621: ステートメントは、匿名メソッドまたはラムダ式内では使用できません。
- CS1628: 匿名メソッド、ラムダ式、またはクエリ式内で 、 、または パラメーターを使用できません。
- CS1632: コントロールは、匿名メソッドまたはラムダ式の本体を残すことはできません。
- CS1673: 構造体内の匿名メソッド、ラムダ式、クエリ式は、 のインスタンス メンバーにアクセスできません。
- CS1686: ローカル変数またはそのメンバーは、アドレスを取得して匿名メソッドまたはラムダ式内で使用することはできません。
- CS1706: 式に匿名メソッドまたはラムダ式を含めることはできません。
- CS1764: 匿名メソッド、ラムダ式、またはクエリ式内で固定ローカルを使用することはできません。
- CS1911: 警告: 匿名メソッド、ラムダ式、クエリ式、または反復子から 'base' キーワードを介してメンバーにアクセスすると、検証できないコードが生成されます。
- CS8175: 匿名メソッド、ラムダ式、またはクエリ式内で ref local を使用できません。
- CS8820: 静的匿名関数に 'variable' への参照を含めることはできません。
- CS8821: 静的匿名関数には、'this' または 'base' への参照を含めることはできません。
- CS8971: 警告: InterpolatedStringHandlerArgument はラムダ パラメーターに適用しても効果がなく、呼び出しサイトでは無視されます。
- CS9236: 情報: コンパイルするには、ラムダ式を少なくとも回数バインドする必要があります。明示的なパラメーター型を使用してラムダ式を宣言することを検討してください。または、包含メソッドの呼び出しがジェネリックの場合は、明示的な型引数の使用を検討してください。
コンパイラは、 ラムダ式 と 匿名メソッド内の特定の C# コンストラクトを禁止します。 これらの制限は、コンパイラがラムダと匿名メソッドを デリゲート 呼び出しまたは 式ツリーに変換し、一部のコンストラクトをそれらの形式で表現できないために存在します。 詳細については、C# 仕様の 匿名関数式 のセクションを参照してください。
これらのエラーは、次のガイダンスを使用して修正できます。
- 任意のまたはステートメントをラムダ本体から外側の反復子メソッドに移動するか、ラムダをステートメント (CS1621) をサポートするローカル関数に変換します。
- ラムダ本体内の外側のメソッドから 、 、または パラメーターを参照することは避けてください。 ラムダが クロージャの一部としてこれらのパラメーターをキャプチャする場合、 のようなパラメーターの参照セマンティクスを保持することはできません。 値をローカル変数にコピーし、代わりにそのローカル変数を使用するか、ラムダをローカル関数 (CS1628) に変換します。
- ラムダ本体から制御を転送する 、 、または ステートメントを削除します。 制御フロー ステートメントは、同じラムダ本体 (CS1632) 内のラベルまたはループをターゲットにする必要があります。
- 型では、ラムダ式、匿名メソッド、またはクエリ式内のを介してインスタンス メンバーを参照しないようにします。 コンパイラは値渡しによってキャプチャするため、ラムダ式内での変更は元のインスタンスに影響しません。 ラムダの前に必要なメンバー値をローカル変数に抽出するか、 に直接アクセスできるローカル関数に変換します (CS1673)。
- ラムダもキャプチャするローカル変数のアドレスを取得しないでください。 コンパイラは、キャプチャされた変数をヒープ割り当てクロージャ オブジェクトに移動し、アドレスが不安定になります。 アドレス取得ロジックをラムダから分離するか、代わりにローカル関数を使用します (CS1686)。
- ラムダ式または匿名メソッドを、それを禁止する包含式の外に移動します。 属性コンストラクターなどの一部の式では、ラムダ式または匿名メソッドが引数としてサポートされていません (CS1706)。
- ラムダ本体内で ローカル変数を使用しないでください。 ステートメントのピン留め保証は、コンパイラによって生成されるクロージャ (CS1764) ではなく、外側のスコープにのみ適用されます。
- ラムダ本体内でローカル変数を使用しないでください。 パラメーターと同様に、ローカルは、ラムダに対してコンパイラによって生成されるクロージャではキャプチャできません。 以外のローカル変数に値を割り当てるか、ラムダをローカル関数に変換します (CS8175)。
- 演算子または演算子の最初のオペランドとしてラムダ式、匿名メソッド、またはメソッド グループを使用しないでください。 これらのコンストラクトには、実行時にテストできる型がありません。 最初に式を変数に割り当て、次に変数をテストします (CS0837)。
- ラムダから 修飾子を削除するか、キャプチャされた変数への参照を削除します。 ラムダは、意図しないクロージャの割り当てを回避するために、ローカル変数やパラメーターをキャプチャすること、またはその他の要素のキャプチャを明示的に禁止します。 外部変数を参照する必要がある場合は、 修飾子を削除します。 ヒープの割り当てを最小限に抑える場合は、値をパラメーターとしてラムダ (CS8820、 CS8821) に渡します。
- ラムダ パラメーターから を削除するか、属性が適用されるメソッドにロジックを移動します。 ラムダ呼び出しでは、通常のメソッド呼び出し (CS8971) と同じ補間文字列ハンドラーが使用されないため、コンパイラはラムダ パラメーターでこの属性を無視します。
- ラムダまたは匿名メソッド内の キーワードを使用して仮想メンバーを呼び出さないようにします。 コンパイラは、検証できないコードを生成するヘルパー メソッドを介して非仮想呼び出しを生成します。 呼び出しを別のメソッドに抽出し、代わりにラムダからそのメソッドを呼び出す (CS1911) ことを検討してください。
- ラムダ式を受け入れるオーバーロードされたメソッド呼び出しの複雑さを軽減するか、明示的な型情報を追加します。 オーバーロードを解決するためにコンパイラがラムダ式を複数回バインドする必要がある場合、この情報診断が出力されます。 明示的なパラメーター型を使用してラムダを宣言するか、ジェネリック メソッド呼び出しで明示的な型引数を指定すると、コンパイラが実行する必要があるバインド パスの数が減ります (CS9236)。
ラムダ式のパラメーターと戻り値
- CS0748: ラムダ パラメーターの使用法に一貫性がありません。パラメーターの型はすべて明示的であるか、すべて暗黙的である必要があります。
- CS1065: このコンテキストでは既定値は無効です。
- CS1643: すべてのコード パスが型 'type' の匿名メソッドで値を返すわけではありません。
- CS1661: パラメーター型がデリゲート パラメーター型と一致しないため、匿名メソッド ブロックを型 'type' に変換できません。
- CS1662: ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、匿名メソッド ブロックを目的のデリゲート型に変換できません。
- CS1676: パラメーター 'number' は'keyword' キーワードで宣言する必要があります。
- CS1677: パラメーター 'number' を 'keyword' キーワードで宣言しないでください。
- CS1678: パラメーター 'number' は型 'type1' として宣言されていますが、'type2' にする必要があります。
- CS1688: 1 つ以上の out パラメーターがあるため、パラメーター リストのない匿名メソッド ブロックをデリゲート型 'delegate' に変換できません。
- CS1731: ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、式をデリゲートに変換できません。
- CS1732: パラメーターが期待されています。
- CS8030: void 戻りデリゲートに変換された匿名関数は、値を返すことができません。
- CS8916: ラムダ式の属性には、かっこで区切ったパラメーター リストが必要です。
- CS8934: 戻り値の型がデリゲートの戻り値の型と一致しないため、匿名メソッドを型 'type' に変換できません。
- CS8975: コンテキスト キーワード 'var' は、明示的なラムダ戻り値の型として使用できません。
- CS9098: 暗黙的に型指定されたラムダ パラメーター '...'は既定値を持つことができません。
これらのエラーは、 ラムダ式パラメーター または戻り値の型宣言に問題があることを示しています。 ラムダ パラメーターと戻り値の型に関する完全な規則については、 ラムダ式、 匿名メソッド、および C# 仕様の 匿名関数式に関する セクションを参照してください。
注
CS1731 と CS1732 は、現在のバージョンの C# コンパイラ (Roslyn) によって生成されなくなりました。 古いコンパイラ バージョンを使用している場合に表示されることがあります。
これらのエラーは、次のガイダンスを使用して修正できます。
- ラムダ式のすべてのパラメーターで同じ型付けスタイルが使用されていることを確認します。 ラムダに複数のパラメーターがある場合、各パラメーターを 明示的に型指定 するか暗黙的に型指定する必要があります。同じパラメーター リストに 2 つのスタイルを混在することはできません (CS0748)。
- 既定値を持つラムダ パラメーターに明示的な型を追加します。 コンパイラでは、既定値をエンコードするカスタム デリゲート型を生成する必要があるため、既定値を持つパラメーターに明示的な型が必要です。 暗黙的に型指定されたパラメーターは、コンパイラがそのデリゲート型 (CS1065、 CS9098) を構築するのに十分な情報を提供しません。
- 演算子を使用して宣言された匿名メソッドから既定のパラメーター値を削除します。 既定のパラメーター値は、匿名メソッドではなく、ラムダ式でのみサポートされます。 既定値 (CS1065) が必要な場合は、匿名メソッドをラムダ式に変換します。
- ラムダまたは匿名メソッドのパラメーター型、 修飾子、およびパラメーター数をターゲット デリゲート型と一致させます。 コンパイラは、匿名関数をデリゲートに変換するときに、パラメーターシグネチャの完全一致を実行します。各パラメーターは正しい型を持つ必要があり、デリゲートが予期する場合は、 、 、または 修飾子が正確に存在する必要があります (CS1661、 CS1676、 CS1677、 CS1678)。
- ターゲット デリゲート型にパラメーターが されている場合は、匿名メソッドにパラメーター リストを追加します。 ( 構文を使用して) パラメーター リストなしで宣言された匿名メソッドは、ほとんどのデリゲート型と一致できますが、コンパイラは必要な パラメーターを暗黙的に合成できません。 デリゲートシグネチャに一致するようにパラメーターを明示的に宣言します (CS1688)。
- ターゲット デリゲート型に void 以外の戻り値の型がある場合は、ラムダまたは匿名メソッド内のすべてのコード パスが値を返すようにします。 本文内のすべての分岐は、デリゲートの戻り値の型 (CS1643、CS1662、CS1731、CS8934) に暗黙的に変換できる戻り値を生成する必要があります。
- などの戻りデリゲート型に割り当てられているラムダメソッドまたは匿名メソッドから、値を持つステートメントを削除します。 デリゲートの戻り値の型は であるため、本文は値を返すことはできません (CS8030)。
- ラムダ パラメーターに 属性 が適用されている場合は、パラメーター リストをかっこで囲みます。 コンパイラでは、属性構文を他の式と区別するために、かっこで結合された形式が必要です。 たとえば、(CS8916) の代わりにこれを書く。
- ラムダ式の明示的な戻り値の型として の代わりに、特定の型名を使用します。 キーワード は 暗黙的に型指定されたローカル変数用に 予約されており、ラムダ戻り値の型注釈として使用することはできません。 実際の戻り値の型を指定するか、戻り値の型を省略してコンパイラに推論させます (CS8975)。
- コンパイラが有効なパラメーター宣言として認識できるように、パラメーター リストを修正します。 このエラーは、形式が正しくないパラメーター リストで、コンパイラがパラメーター識別子を予期していたが、他のパラメーター識別子が見つかったことを示します (CS1732)。
ラムダ式デリゲート型
- CS0407: 'method' の戻り値の型が正しくありません。
- CS0428: メソッド グループ 'Identifier' を非デリゲート型 'type' に変換できません。メソッドを呼び出すつもりでしたか?
- CS0467: 警告: メソッド 'method' と非メソッド 'non-method' の間のあいまいさ。メソッド グループの使用。
- CS0815: 暗黙的に型指定された変数に 'expression' を割り当てることはできません。
- CS0828: 匿名型プロパティに 'expression' を割り当てることはできません。
- CS1660: ラムダ式はデリゲート型ではないため、型 'type' に変換できません。
- CS8917: デリゲート型を推論できませんでした。
- CS8974: 警告: メソッド グループ 'method' を非デリゲート型 'type' に変換します。メソッドを呼び出すつもりでしたか?
- CS9099: 警告: 既定のパラメーター値がターゲット デリゲート型と一致しません。
- CS9100: 警告: パラメーターにはラムダのパラメーター修飾子がありますが、ターゲット デリゲート型には含まれません。
これらのエラーは、ラムダ式、匿名メソッド、またはメソッド グループについてコンパイラが推論または想定しているデリゲート型に問題があることを示しています。 デリゲート変換に関する完全な規則については、 ラムダ式、 匿名メソッド、および C# 仕様の 匿名関数式に関する セクションを参照してください。
注
現在のバージョンの C# コンパイラ (Roslyn) では CS0467 は生成されません。 古いコンパイラ バージョンを使用している場合は、このエラーが表示されることがあります。
これらのエラーは、次のガイダンスを使用して修正できます。
- 割り当てまたは変換のターゲットの型が デリゲート型 または であることを確認します。 ラムダ式または匿名メソッドを、 やインターフェイスなどの非デリゲート型に割り当てることはできません。 変数の型を、 や などの互換性のあるデリゲート型に変更するか、 を使用してコンパイラがデリゲート型 (CS1660) を推論できるようにします。
- ラムダ式の 1 つのデリゲート型を決定するのに十分なコンテキストをコンパイラに提供します。 に割り当てられると、コンパイラには明確な戻り値の型とパラメーター リストが必要です。 匿名型プロパティに割り当てられると、コンパイラはデリゲート型をまったく推論できません。 明示的なデリゲート型を持つ変数にラムダを割り当て、その変数を匿名型初期化子 (CS0815、 CS0828、 CS8917) で使用します。
- メソッド グループの戻り値の型をデリゲートの宣言された戻り値の型と一致させます。 メソッド グループ変換では、メソッドの戻り値の型が ID 変換可能であるか、デリゲートの戻り値の型に暗黙的に変換できる必要があります。 メソッドの戻り値の型を変更するか、デリゲートの型を一致するように変更します (CS0407)。
- ターゲットの型がデリゲートでない場合は、メソッド グループを割り当てるのではなく、メソッドを呼び出します。 ターゲットの型が 、 、または別のデリゲート以外の型である場合は、メソッドを呼び出してその結果を割り当てることを意図している可能性があります。 メソッドを呼び出すために括弧と引数を追加します (CS0428、CS8974)。
- メソッドと、同じ名前を共有するメソッド以外のメンバーの間のあいまいさを解決します。 競合するメンバーの名前を変更するか、完全修飾参照を使用してあいまいさを削除します (CS0467)。
- ターゲット デリゲート型が標準のまたは型の場合は、ラムダから既定のパラメーター値または修飾子を削除します。 既定値と 修飾子により、コンパイラは、 または に一致しないカスタム デリゲート型を生成します。 を使用してコンパイラが正しいデリゲート型を合成できるようにするか、ラムダが宣言されたデリゲート型 (CS9099、CS9100) と一致するように既定値または修飾子を削除します。
.NET