C# コンパイラのあいまいな呼び出しエラー: メソッド グループとデリゲートの型
C# では、メソッド グループ構文を使用して複数のオーバーロードを持つ関数を呼び出すと、コンパイラで「あいまいな呼び出し」エラーが発生することがあります。このエラーは、互換性のあるデリゲート型を持つメソッド グループが 2 つある場合、コンパイラがどのオーバーロードを呼び出すかを判断できないために発生します。
次のコード例を考えてみましょう:
<code class="language-csharp">public class ClassWithDelegateMethods { public void Method(Func<string> func) { /* do something */ } public void Method(Action action) { /* do something */ } } public class ClassWithSimpleMethods { public string GetString() { return ""; } public void DoNothing() { } } public class Program { public static void Main(string[] args) { // 错误:歧义调用 ClassWithDelegateMethods classWithDelegateMethods = new ClassWithDelegateMethods(); classWithDelegateMethods.Method(classWithSimpleMethods.GetString); // 这里会报错 classWithDelegateMethods.Method(classWithSimpleMethods.DoNothing); // 这里会报错 } }</code>
ClassWithDelegateMethods.Method
の両方のオーバーロードは、匿名メソッドまたはラムダ式を使用して問題なく呼び出すことができます。ただし、メソッド グループ構文を使用して classWithSimpleMethods.GetString
または classWithSimpleMethods.DoNothing
を呼び出すと、あいまいさエラーが発生します。
このエラーの理由は、メソッド グループとデリゲート型の間の暗黙の変換ルールにあります。 C# 仕様によれば、メソッド グループ間で互換性のあるデリゲート型への暗黙的な変換が行われます。ただし、オーバーロードを含むメソッド グループの場合、仕様では、どのオーバーロードに変換するかを決定するメカニズムが定義されていません。
曖昧なエラーを避ける
あいまいさエラーを解決するには、メソッド グループを必要なデリゲート型に明示的にキャストできます。例:
<code class="language-csharp">// 无错误 classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString); classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);</code>
C# 7.3 以降では、コンパイラの改良されたオーバーロード候補選択アルゴリズムにより、この問題は解消されます。したがって、C# 7.3 以降では、上記のコード例は明示的な変換を行わずにコンパイルする必要があります。
以上がオーバーロードされたデリゲート メソッドを持つメソッド グループを使用すると、C# が「あいまいな呼び出し」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。