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!