Heim >Backend-Entwicklung >C++ >Warum verursacht die Methodengruppensyntax mehrdeutige Aufruffehler bei Delegatenüberladungen?

Warum verursacht die Methodengruppensyntax mehrdeutige Aufruffehler bei Delegatenüberladungen?

Linda Hamilton
Linda HamiltonOriginal
2025-01-13 10:10:43794Durchsuche

Why Method Group Syntax Causes Ambiguous Invocation Errors (C# Delegate Overloads)

Mehrdeutige Aufruffehler, die durch die Syntax der C#-Methodengruppe und die Überladung von Delegaten verursacht werden

Szenario:

Angenommen, Sie möchten eine Funktion aufrufen, die zwei Überladungen hat: eine, die einen Action-Delegaten akzeptiert, und eine andere, die einen Func-Delegaten akzeptiert. Sie bevorzugen die Verwendung der Methodengruppensyntax anstelle anonymer Methoden (Lambda-Ausdrücke).

Frage:

Wenn Sie versuchen, diese Überladungen mithilfe der Methodengruppensyntax aufzurufen, wird ein Compilerfehler mehrdeutiger Aufruf auftreten.

Erklärung:

Der Grund für diese Mehrdeutigkeit liegt in den impliziten Konvertierungsregeln für Methodengruppen und Delegatentypen. Gemäß der C#-Spezifikation können Methodengruppen implizit in kompatible Delegate-Typen konvertiert werden. Allerdings bezieht sich „Kompatibilität“ in diesem Zusammenhang auf die Kompatibilität von Methoden und Delegaten-Typen, nicht auf die Kompatibilität von Methodengruppen und Delegaten-Typen.

Im gegebenen Beispiel ist die Methodengruppe classWithSimpleMethods.GetString ein gültiger Kandidat für beide Delegatenüberladungen: classWithDelegateMethods.Method(Action) und classWithDelegateMethods.Method(Func<string>). Da es keine klaren Typregeln gibt, um zu bestimmen, welche Konvertierung besser ist, generiert der Compiler einen mehrdeutigen Aufruffehler.

Lösung:

Um diese Mehrdeutigkeit zu beseitigen, können Sie wie folgt eine explizite Umwandlung in den entsprechenden Delegatentyp bereitstellen:

<code class="language-csharp">classWithDelegateMethods.Method((Action)classWithSimpleMethods.DoNothing);
classWithDelegateMethods.Method((Func<string>)classWithSimpleMethods.GetString);</code>

C# 7.3-Update:

Ab C# 7.3 erhalten Sie bei Verwendung der Methodengruppensyntax keine mehrdeutigen Aufruffehler mehr. Dank der verbesserten Reihenfolge der Überladungskandidaten leitet der Compiler nun korrekt den erwarteten Delegatentyp basierend auf dem Kontext ab.

Das obige ist der detaillierte Inhalt vonWarum verursacht die Methodengruppensyntax mehrdeutige Aufruffehler bei Delegatenüberladungen?. 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