Heim > Backend-Entwicklung > C++ > Warum gibt C# einen „Mehrdeutiger Aufruf'-Fehler aus, wenn Methodengruppen mit überladenen Delegate-Methoden verwendet werden?

Warum gibt C# einen „Mehrdeutiger Aufruf'-Fehler aus, wenn Methodengruppen mit überladenen Delegate-Methoden verwendet werden?

Patricia Arquette
Freigeben: 2025-01-13 10:35:43
Original
466 Leute haben es durchsucht

Why Does C# Throw an

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

Wenn in C# eine Funktion mit mehreren Überladungen mithilfe der Methodengruppensyntax aufgerufen wird, kann der Compiler auf einen „mehrdeutigen Aufruf“-Fehler stoßen. Dieser Fehler tritt auf, weil der Compiler nicht bestimmen kann, welche Überladung aufgerufen werden soll, wenn zwei Methodengruppen mit kompatiblen Delegattypen vorhanden sind.

Betrachten Sie das folgende Codebeispiel:

<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>
Nach dem Login kopieren
Beide Überladungen von

ClassWithDelegateMethods.Method können problemlos mit anonymen Methoden oder Lambda-Ausdrücken aufgerufen werden. Der Aufruf von classWithSimpleMethods.GetString oder classWithSimpleMethods.DoNothing mithilfe der Methodengruppensyntax führt jedoch zu einem Mehrdeutigkeitsfehler.

Der Grund für diesen Fehler liegt in den impliziten Konvertierungsregeln zwischen Methodengruppen und Delegatentypen. Gemäß der C#-Spezifikation gibt es implizite Konvertierungen zwischen Methodengruppen in kompatible Delegattypen. Für Methodengruppen mit Überladungen definiert die Spezifikation jedoch keinen Mechanismus zur Bestimmung, in welche Überladung konvertiert werden soll.

Mehrdeutige Fehler vermeiden

Um Mehrdeutigkeitsfehler zu beheben, können Methodengruppen explizit in den erforderlichen Delegatentyp umgewandelt werden. Zum Beispiel:

<code class="language-csharp">// 无错误
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);
classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);</code>
Nach dem Login kopieren

Alternativ wird dieses Problem ab C# 7.3 durch den verbesserten Auswahlalgorithmus für Überlastungskandidaten des Compilers beseitigt. Daher sollte das obige Codebeispiel in C# 7.3 und höher ohne explizite Konvertierung kompiliert werden.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage