メソッド グループの構文とデリゲート オーバーロードによるあいまいな呼び出し
ラムダ式の代わりにメソッド グループ構文を使用すると、Action
または Func<string>
デリゲートを受け入れるオーバーロードされたメソッドを処理するときにあいまいさが生じる可能性があります。 ラムダ式はシームレスに動作しますが、メソッド グループは「あいまいな呼び出し」エラーをトリガーします。
明示的なキャストの必要性: 変換ルールを理解する
根本的な原因は、変換ルールを委任するための C# のメソッド グループにあります。 メソッド グループは暗黙的に 互換性のある デリゲート型に変換されます。つまり、パラメーターの型と修飾子が一致する必要があります。 重要なのは、この暗黙的な変換では 戻り値の型 が考慮されないことです。
オーバーロードの解決中に、コンパイラーは該当するメソッドを検索します。メソッドは、そのパラメータが指定された引数から暗黙的に変換できる場合に適用できます。 このシナリオでは、パラメーター リストが空であるため、classWithSimpleMethods.GetString()
は Func<string>
と Action
の両方に適用されます。 コンパイラは、これらの同等に有効な変換の中から選択することができないため、あいまいさエラーが発生します。 メソッド グループを Action
または Func<string>
に明示的にキャストすると、この問題が解決されます。
C# 7.3 以降: オーバーロード解決の改善
Jon Skeet 氏が指摘したように、C# 7.3 ではオーバーロード解決の機能強化が導入され、この曖昧さが軽減されました。 多くの場合、C# 7.3 以降のバージョンでは明示的なキャストは必要なくなりました。
以上がメソッド グループ構文により、オーバーロードされたデリゲート (アクションと関数) で「あいまいな呼び出し」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。