Fehler und Warnungen bei der Verwendung von Lambdaausdrücken und anonymen Funktionen
Es gibt mehrere Fehler im Zusammenhang mit dem Deklarieren und Verwenden von Lambdaausdrücken:
- CS0748 - Inkonsistente Verwendung des Lambdaparameters. Parametertypen müssen entweder nur explizit oder nur implizit sein.
- CS1621 - Die yield-Anweisung kann nicht in einer anonymen Methode oder einem Lambdaausdruck verwendet werden.
- CS1628 - Der
in
-,ref
- oderout
-Parameter kann nicht in einer anonymen Methode, einem Lambdaausdruck oder einem Abfrageausdruck verwendet werden. - CS1632 - Ein Steuerelement kann den Text einer anonymen Methode oder eines Lambdaausdrucks nicht verlassen.
- CS1673 - Anonyme Methoden, Lambdaausdrücke und Abfrageausdrücke innerhalb von Strukturen können nicht auf Instanzmember von „this“ zugreifen.
- CS1686 - Adressen lokaler Variablen oder ihrer Member können nicht übernommen und in einer anonymen Methode oder einem Lambdaausdruck verwendet werden.
- CS1706 - Der Ausdruck darf keine anonymen Methoden oder Lambdaausdrücke enthalten.
- CS8030 - Eine anonyme Funktion, die in einen „void“ zurückgebenden Delegaten konvertiert wurde, kann keinen Wert zurückgeben.
- CS8175 - Eine lokale ref-Variable kann nicht in einer anonymen Methode, einem Lambdaausdruck oder einem Abfrageausdruck verwendet werden.
- CS8916 - Attribute für Lambdaausdrücke erfordern eine in Klammern eingeschlossene Parameterliste.
- CS8971 - InterpolatedStringHandlerArgument hat bei Anwendung auf Lambdaparameter keine Auswirkungen und wird am Aufrufstandort ignoriert.
- CS8975 - Das kontextbezogene Schlüsselwort
var
kann nicht als expliziter Lambdarückgabetyp verwendet werden. - CS9098 - Der implizit eingegebene Parameter „{0}“ der Lambdafunktion darf keinen Standardwert aufweisen.
- CS9170 - Eine Ausdrucksstruktur darf keinen Inlinearrayzugriff oder keine -Konvertierung enthalten
Außerdem gibt es mehrere Warnungen im Zusammenhang mit dem Deklarieren und Verwenden von Lambdaausdrücken:
- CS8971 - InterpolatedStringHandlerArgument hat bei Anwendung auf Lambdaparameter keine Auswirkungen und wird am Aufrufstandort ignoriert.
- CS9099 - Der Standardparameterwert stimmt nicht mit dem Zieldelegattyp überein.
- CS9100 - Der Parameter verfügt über den Modifizierer „params“ in der Lambdafunktion, aber nicht im Zieldelegattyp.
Syntaxeinschränkungen in Lambdaausdrücken
Ein Teil der C#-Syntax ist in Lambdaausdrücken und anonymen Methoden verboten. Die Verwendung ungültiger Konstrukte in einem Lambdaausdruck verursacht die folgenden Fehler:
- CS1621: Die
yield
-Anweisung kann nicht in einer anonymen Methode oder einem Lambdaausdruck verwendet werden. - CS1628: Der
in
-,ref
- oderout
-Parameter kann nicht in einer anonymen Methode, einem Lambdaausdruck oder einem Abfrageausdruck verwendet werden. - CS1632: Ein Steuerelement kann den Text einer anonymen Methode oder eines Lambdaausdrucks nicht verlassen.
- CS1673: Anonyme Methoden, Lambdaausdrücke und Abfrageausdrücke innerhalb von Strukturen können nicht auf Instanzmember von
this
zugreifen. - CS1686: Die Adressen von lokalen Variablen oder ihren Membern können nicht übernommen und in einer anonymen Methode oder einem Lambdaausdruck verwendet werden.
- CS8175: Eine lokale ref-Variable kann nicht in einer anonymen Methode, einem Lambdaausdruck oder einem Abfrageausdruck verwendet werden.
- CS9170 - Eine Ausdrucksstruktur darf keinen Inlinearrayzugriff oder keine -Konvertierung enthalten
Die folgenden Konstrukte sind in Lambdaausdrücken alle unzulässig:
yield
-Anweisungen (yield return
oderyield break
)- Aufrufen einer Methode mit einem
in
-,ref
- oderout
-Parameter - Lokale
ref
-Variablen break
-,goto
- undcontinue
-Anweisungenthis
-Zugriff, wennthis
einstruct
-Typ ist- Anonyme Methoden oder Lambdaausdrücke in einem anderen Ausdruck, z. B. einem Attributkonstruktor.
- Inlinearrays.
Sie können keines dieser Konstrukte in einem Lambdaausdruck oder einer anonymen Methode verwenden. „Many“ ist sind in einer lokalen Funktion zulässig.
Darüber hinaus werden interpolierte Zeichenfolgen-Handlertypen ignoriert, wenn sie auf einen Lambdaparameter angewendet werden. Bei Verwendung wird die folgende Warnung angezeigt:
- CS8971 - InterpolatedStringHandlerArgument hat bei Anwendung auf Lambdaparameter keine Auswirkungen und wird am Aufrufstandort ignoriert.
Lambdaausdruckparameter und -rückgaben
Diese Fehler weisen auf ein Problem mit einer Parameterdeklaration hin:
- CS0748 - Inkonsistente Verwendung des Lambdaparameters. Parametertypen müssen entweder nur explizit oder nur implizit sein.
- CS9098 - Der implizit eingegebene Parameter „{0}“ der Lambdafunktion darf keinen Standardwert aufweisen.
- CS8030 - Eine anonyme Funktion, die in einen „void“ zurückgebenden Delegaten konvertiert wurde, kann keinen Wert zurückgeben.
- CS8916 - Attribute für Lambdaausdrücke erfordern eine in Klammern eingeschlossene Parameterliste.
- CS8975 - Das kontextbezogene Schlüsselwort „var“ kann nicht als expliziter Lambdarückgabetyp verwendet werden.
Lambda-Ausdrucksparameter müssen die folgenden Regeln befolgen:
- Wenn ein Lambdaausdruck über mehrere Parameter verfügt, müssen alle Parameter entweder explizit typisiert oder alle Parameter implizit typisiert werden.
- Alle Lambdaparameter mit einem Standardwert müssen explizit typisiert werden.
- Wenn Attribute auf beliebige Parameter angewendet werden, muss die Parameterliste in Klammern eingeschlossen werden.
Rückgabetypen von Lambdaausdrücken müssen den folgenden Regeln entsprechen:
- Ein Lambdaausdruck, der einen beliebigen Wert zurückgibt, kann nicht in einen
void
zurückgebenden Delegaten konvertiert werden, z. B.Action
. - Der Rückgabetyp ist entweder abgeleitet oder ein expliziter Typ. Ein Rückgabetyp, der mit dem Schlüsselwort
var
deklariert wurde, ist unzulässig.
Lambdaausdrucks-Delegattyp
- CS9099: Warnung: Der Standardparameterwert stimmt nicht mit dem Zieldelegattyp überein.
Wenn Sie einen Standardwert deklarieren oder den params
-Modifizierer mit einem Lambdaausdruckparameter hinzufügen, ist der Delegattyp kein Func
- oder Action
-Typ. Vielmehr handelt es sich um einen benutzerdefinierten Typ, der den Standardparameterwert oder den params
-Modifizierer enthält. Der folgende Code generiert Warnungen, da er einem Action
-Typ einen Lambdaausdruck zuweist, der über einen Standardparameter verfügt:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
Um den Fehler zu beheben, entfernen Sie entweder den Standardparameter, oder verwenden Sie eine implizit typisierte Variable für den Delegattyp:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };
.NET feedback
The .NET documentation is open source. Provide feedback here.
Feedback
Feedback senden und anzeigen für