C# メソッド グループ構文とデリゲートのオーバーロードによって引き起こされるあいまいな呼び出しエラー
シナリオ:
2 つのオーバーロードを持つ関数を呼び出すとします。1 つは Action デリゲートを受け入れ、もう 1 つは Func
質問:
メソッド グループ構文を使用してこれらのオーバーロードを呼び出そうとすると、コンパイラ あいまいな呼び出し エラーが発生します。
説明:
このあいまいさの理由は、メソッド グループとデリゲート型の暗黙的な変換ルールにあります。 C# 仕様によれば、メソッド グループは互換性のあるデリゲート型に暗黙的に変換できます。ただし、この文脈における「互換性」とは、メソッド グループとデリゲートの型の互換性ではなく、メソッドとデリゲートの型の互換性を指します。
指定された例では、メソッド グループ classWithSimpleMethods.GetString
は両方のデリゲート オーバーロードの有効な候補です: classWithDelegateMethods.Method(Action)
と classWithDelegateMethods.Method(Func<string>)
。どの変換が優れているかを決定するための明確な型規則がないため、コンパイラはあいまいな呼び出しエラーを生成します。
解決策:
このあいまいさを解決するには、次のように、対応するデリゲート型への明示的なキャストを提供します。
<code class="language-csharp">classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing); classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);</code>
C# 7.3 アップデート:
C# 7.3 以降では、メソッド グループ構文を使用するときにあいまいな呼び出しエラーが発生しなくなります。オーバーロード候補の順序付けが改善されたことにより、コンパイラはコンテキストに基づいて予期されるデリゲート型を正しく推測できるようになりました。以上がデリゲートのオーバーロードでメソッド グループの構文があいまいな呼び出しエラーを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。