C# メソッド グループのオーバーロード解決の曖昧さ
問題:
C# でオーバーロードされたデリゲート メソッドでメソッド グループ構文を使用すると、匿名メソッドが同じオーバーロードを正常に呼び出す場合でも、「あいまいな呼び出し」コンパイラ エラーが発生する可能性があります。
それが起こる理由:
C# コンパイラには、オーバーロードの解決中にメソッド グループを複数の互換性のあるデリゲート型に変換する際の決定的な「より良い」ルールがありません。 たとえば、classWithSimpleMethods.GetString
が Func<string>
と Action
の両方に変換できる場合、コンパイラーはどちらかを選択できず、あいまいさが生じます。
解決 (明示的な型キャスト):
解決策は、メソッド グループを目的のデリゲート型に明示的にキャストすることです。
<code class="language-csharp">classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);</code>
C# 7.3 の改善:
C# 7.3 では、メソッド グループのオーバーロード解決が強化されました。 多くの場合 (提供された例のように)、classWithDelegateMethods.Method(classWithSimpleMethods.GetString)
および同様の呼び出しは明示的なキャストなしでコンパイルされるようになりました。 ただし、複雑なシナリオでは依然としてあいまいさが生じる可能性があります。
以上がC# であいまいな呼び出しエラーが発生し、メソッド グループのオーバーロード解決が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。