Heim >Backend-Entwicklung >C++ >Warum führt die Methodengruppensyntax zu „mehrdeutigen Aufruffehlern' bei überlasteten Delegaten (Aktion vs. Funktion)?
Methodengruppensyntax und mehrdeutiger Aufruf mit Delegatüberladungen
Die Verwendung der Methodengruppensyntax anstelle von Lambda-Ausdrücken kann zu Mehrdeutigkeiten führen, wenn es um überladene Methoden geht, die Action
- oder Func<string>
-Delegaten akzeptieren. Während Lambda-Ausdrücke nahtlos funktionieren, lösen Methodengruppen einen Fehler „Mehrdeutiger Aufruf“ aus.
Die Notwendigkeit einer expliziten Besetzung: Konvertierungsregeln verstehen
Die Hauptursache liegt in der Methodengruppe von C# zum Delegieren von Konvertierungsregeln. Eine Methodengruppe wird implizit in einen kompatiblen Delegatentyp konvertiert, was bedeutet, dass Parametertypen und Modifikatoren übereinstimmen müssen. Entscheidend ist, dass der Rückgabetyp bei dieser impliziten Konvertierung nicht berücksichtigt wird.
Während der Überladungsauflösung sucht der Compiler nach anwendbaren Methoden. Eine Methode ist anwendbar, wenn ihre Parameter implizit aus den bereitgestellten Argumenten konvertiert werden können. In diesem Szenario ist classWithSimpleMethods.GetString()
auf sowohl Func<string>
als auch auf Action
anwendbar, da die Parameterlisten leer sind. Der Compiler kann nicht zwischen diesen gleichermaßen gültigen Konvertierungen wählen, daher der Mehrdeutigkeitsfehler. Durch explizites Umwandeln der Methodengruppe in Action
oder Func<string>
wird dieses Problem behoben.
C# 7.3 und höher: Verbesserte Überlastungsauflösung
Wie Jon Skeet anmerkte, führte C# 7.3 Verbesserungen bei der Überladungsauflösung ein, um diese Mehrdeutigkeit zu mildern. In vielen Fällen ist eine explizite Umwandlung mit C# 7.3 und späteren Versionen nicht mehr erforderlich.
Das obige ist der detaillierte Inhalt vonWarum führt die Methodengruppensyntax zu „mehrdeutigen Aufruffehlern' bei überlasteten Delegaten (Aktion vs. Funktion)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!