ホームページ > バックエンド開発 > C++ > オーバーロードされたデリゲート メソッドを持つメソッド グループを使用すると、C# が「あいまいな呼び出し」エラーをスローするのはなぜですか?

オーバーロードされたデリゲート メソッドを持つメソッド グループを使用すると、C# が「あいまいな呼び出し」エラーをスローするのはなぜですか?

Patricia Arquette
リリース: 2025-01-13 10:35:43
オリジナル
466 人が閲覧しました

Why Does C# Throw an

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート