Heim >Backend-Entwicklung >C++ >Warum verursacht die Methodengruppensyntax mehrdeutige Aufruffehler bei Delegatenüberladungen?
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
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!