Heim >Backend-Entwicklung >C++ >Warum gibt C# einen „Mehrdeutiger Aufruf'-Fehler aus, wenn Methodengruppen, aber keine anonymen Methoden verwendet werden?

Warum gibt C# einen „Mehrdeutiger Aufruf'-Fehler aus, wenn Methodengruppen, aber keine anonymen Methoden verwendet werden?

Susan Sarandon
Susan SarandonOriginal
2025-01-13 06:08:12494Durchsuche

Why Does C# Throw an

Fehler beim mehrdeutigen Aufruf des C#-Compilers: anonyme Methode und Methodengruppe

C# bietet zwei Syntaxen zum Aufrufen von Funktionen: anonyme Methoden (oder Lambda-Syntax) und Methodengruppen. Bei der Verwendung der Methodengruppensyntax kann es zu Mehrdeutigkeiten kommen, wenn eine Funktion über mehrere Überladungen verfügt, die unterschiedliche Delegattypen akzeptieren.

Betrachten Sie das folgende Codebeispiel:

<code class="language-csharp">class Program
{
    public static void Main()
    {
        // 匿名方法(编译成功)
        Method(() => classWithSimpleMethods.GetString());
        Method(() => classWithSimpleMethods.DoNothing());

        // 使用显式转换的方法组(也编译成功)
        Method((Func<string>)classWithSimpleMethods.GetString);
        Method((Action)classWithSimpleMethods.DoNothing);

        // 方法组(错误:“歧义调用”)
        Method(classWithSimpleMethods.GetString);
        Method(classWithSimpleMethods.DoNothing);
    }

    public static void Method(Func<string> func) { /* 执行某些操作 */ }
    public static void Method(Action action) { /* 执行某些操作 */ }
}</code>

In diesem Beispiel verfügt die Method-Funktion über zwei Überladungen, eine, die Action akzeptiert, und die andere, die Func<string> akzeptiert. Wenn die Funktion mit einer anonymen Methode oder einer expliziten Umwandlung in den richtigen Delegatentyp aufgerufen wird, wird der Code fehlerfrei kompiliert. Bei Verwendung der Methodengruppensyntax meldet der Compiler jedoch einen Fehler „mehrdeutiger Aufruf“.

Mehrdeutigkeit verstehen

Die C#-Sprachspezifikation besagt, dass es implizite Konvertierungen von Methodengruppen in kompatible Delegattypen gibt. In diesem Fall besteht für den Compiler jedoch Unklarheit, da die Methodengruppe classWithSimpleMethods.GetString implizit in Func<string> und Action konvertiert werden kann.

Gemäß der Spezifikation umfasst die Überlastungsauflösung die Auswahl des am besten geeigneten Kandidaten basierend auf übereinstimmenden Argumenttypen. Obwohl die Parameterliste der GetString-Methode mit beiden Überladungen kompatibel ist, kann der Compiler nicht die beste Übereinstimmung ermitteln, da er den Rückgabetyp bei der Überladungsauflösung nicht berücksichtigt.

Unklarheiten lösen

Um Mehrdeutigkeiten aufzulösen, können Sie eine explizite Umwandlung in den richtigen Delegatentyp verwenden, wie im Codebeispiel gezeigt. Dieser Ansatz kann jedoch mühsam und fehleranfällig sein.

Glücklicherweise wurde der Compiler in C# 7.3 und höher verbessert, um diese Situation zu bewältigen. Überlastungskandidaten werden jetzt basierend auf der Kompatibilität mit dem Zieldelegatentyp eingestuft, sodass in diesem Fall keine expliziten Konvertierungen erforderlich sind.

Das obige ist der detaillierte Inhalt vonWarum gibt C# einen „Mehrdeutiger Aufruf'-Fehler aus, wenn Methodengruppen, aber keine anonymen Methoden verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn