Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
Es gibt mehrere Fehler im Zusammenhang mit der Deklarierung und Verwendung von Lambda-Ausdrücken:
- CS0748: Inkonsistente Lambda-Parameterverwendung; Parametertypen müssen alle expliziten oder alle impliziten Sein.
- CS1621: Die yield-Anweisung kann nicht in einer anonymen Methode oder einem Lambda-Ausdruck verwendet werden.
-
CS1628: Parameter
inrefoderoutkönnen nicht innerhalb einer anonymen Methode, eines Lambda-Ausdrucks oder eines Abfrageausdrucks verwendet werden. - CS1632: Kontrolle kann den Block einer anonymen Methode oder eines Lambda-Ausdrucks nicht verlassen.
- CS1673: Anonyme Methoden, Lambdaausdrücke und Abfrageausdrücke innerhalb von Strukturen können nicht auf Instanzmmelemente von "this" zugreifen.
- CS1686: Lokale Variable oder ihre Member können nicht, wenn ihre Adresse übernommen wird, innerhalb einer anonymen Methode oder eines Lambda-Ausdrucks verwendet werden.
- CS1706: Ausdruck darf keine anonymen Methoden oder Lambda-Ausdrücke enthalten.
- CS8030: Anonyme Funktion, die in einen ungültigen Rückgabedelegat konvertiert wurde, kann keinen Wert zurückgeben.
- CS8175: Ref local kann nicht innerhalb einer anonymen Methode, eines Lambda-Ausdrucks oder eines Abfrageausdrucks verwendet werden.
- CS8916: Attribute für Lambda-Ausdrücke erfordern eine Klammerparameterliste.
- CS8971: InterpolatedStringHandlerArgument hat keine Auswirkung, wenn sie auf Lambda-Parameter angewendet wird und an der Aufrufwebsite ignoriert wird.
-
CS8975: Das Kontextschlüsselwort
varkann nicht als expliziter Lambda-Rückgabetyp verwendet werden. - CS9098: Implizit eingegebener Lambda-Parameter '...' kann keinen Standardwert haben.
Darüber hinaus gibt es mehrere Warnungen im Zusammenhang mit der Deklarierung und Verwendung von Lambda-Ausdrücken:
- CS8971: InterpolatedStringHandlerArgument hat keine Auswirkung, wenn sie auf Lambda-Parameter angewendet wird und an der Aufrufwebsite ignoriert wird.
- CS9099: Der Standardwert des Parameters stimmt nicht mit dem Zieldelegattyp überein.
- CS9100: Parameter verfügt über einen Paramsmodifizierer in Lambda, aber nicht im Zieldelegattyp.
Der Compiler erzeugt auch die folgende Informationsmeldung :
- CS9236: Für die Kompilierung muss der Lambda-Ausdruck mindestens einige Male zugewiesen werden. Erwägen Sie, den Lambda-Ausdruck mit expliziten Parametertypen zu deklarieren. Wenn der enthaltene Methodenaufruf generisch ist, sollten Sie die Verwendung expliziter Typargumente in Betracht ziehen.
Syntaxbeschränkungen in Lambda-Ausdrücken
Einige C#-Syntax ist in Lambda-Ausdrücken und anonymen Methoden verboten. Die Verwendung ungültiger Konstrukte in einem Lambda-Ausdruck verursacht die folgenden Fehler:
-
CS1621: Die
yieldAnweisung kann nicht innerhalb einer anonymen Methode oder eines Lambda-Ausdrucks verwendet werden. -
CS1628: Kann den Parameter
in,refoderoutnicht innerhalb einer anonymen Methode, eines Lambda-Ausdrucks oder eines Abfrageausdrucks verwenden. - CS1632: Steuerung kann den Körper einer anonymen Methode oder eines Lambda-Ausdrucks nicht verlassen.
-
CS1673: Anonyme Methoden, Lambdaausdrücke und Abfrageausdrücke innerhalb von Strukturen können nicht auf Instanzmmelemente von
thiszugreifen. - CS1686: Lokale Variablen oder ihre Member dürfen ihre Adresse nicht abgerufen haben und innerhalb einer anonymen Methode oder eines Lambda-Ausdrucks verwendet werden.
- CS8175: Ref local kann nicht innerhalb einer anonymen Methode, eines Lambda-Ausdrucks oder eines Abfrageausdrucks verwendet werden.
Alle folgenden Konstrukte sind in Lambda-Ausdrücken unzulässig:
-
yieldAnweisungen (yield returnoderyield break) - Aufrufen einer Methode mit einem
in,refoderoutParameter -
refLokale Variablen -
break-,goto- undcontinue-Anweisungen -
thisZugriff, wennthises sich um einenstructTyp handelt - Anonyme Methoden oder Lambda-Ausdrücke innerhalb eines anderen Ausdrucks, z. B. ein Attributkonstruktor.
Sie können keine dieser Konstrukte in einem Lambda-Ausdruck oder einer anonymen Methode verwenden. Viele sind in einer lokalen Funktion zulässig.
Darüber hinaus werden interpolierte Zeichenfolgenhandlertypen ignoriert, wenn sie auf einen Lambda-Parameter angewendet werden. Wenn Sie eines verwenden, wird die folgende Warnung angezeigt:
- CS8971: InterpolatedStringHandlerArgument hat keine Auswirkung, wenn sie auf Lambda-Parameter angewendet wird und an der Aufrufwebsite ignoriert wird.
Bestimmte Ausdrücke führen dazu, dass der Compiler die folgende Informationswarnung ausgibt:
- CS9236: Für die Kompilierung ist das Binden des Lambda-Ausdrucks mindestens Anzahl von Malen erforderlich. Erwägen Sie, den Lambda-Ausdruck mit expliziten Parameterarten zu deklarieren, oder wenn der aufrufende Methodenaufruf generisch ist, die Verwendung expliziter Typargumente in Betracht zu ziehen.
Die Komplexität der Lambda-Ausdrücke und deren Aufruf anderer Lambda-Ausdrücke wirkt sich negativ auf die Compilerleistung aus. Der Grund dafür ist, dass der Compiler Parameter- und Argumenttypen über die Lambda-Ausdrücke ableiten muss und die potenziellen Typen Zeit in Anspruch nehmen.
Lambda-Ausdrucksparameter und -Rückgaben
Diese Fehler deuten auf ein Problem mit einer Parameterdeklaration hin:
- CS0748: Inkonsistente Lambda-Parameterverwendung; Parametertypen müssen alle expliziten oder alle impliziten Sein.
- CS9098: Ein implizit typisierter Lambda-Parameter '...' kann keinen Standardwert haben.
- CS8030: Anonyme Funktion, die in einen ungültigen Rückgabedelegat konvertiert wurde, kann keinen Wert zurückgeben.
- CS8916: Attribute für Lambda-Ausdrücke erfordern eine Klammerparameterliste.
- CS8975: Das kontextbezogene Schlüsselwort "var" kann nicht als expliziter Lambda-Rückgabetyp verwendet werden.
Lambda-Ausdrucksparameter müssen den folgenden Regeln entsprechen:
- Wenn ein Lambda-Ausdruck über mehrere Parameter verfügt, müssen entweder alle Parameter explizit eingegeben werden, oder alle Parameter müssen implizit eingegeben werden.
- Alle Lambda-Parameter mit einem Standardwert müssen explizit eingegeben werden.
- Wenn Attribute auf Parameter angewendet werden, muss die Parameterliste in Klammern eingeschlossen werden.
Rückgabetypen von Lambda-Ausdrücken müssen den folgenden Regeln entsprechen:
- Ein Lambda-Ausdruck, der einen beliebigen Wert zurückgibt, kann nicht in einen
void-zurückgebenden Delegaten konvertiert werden, wie z. B.Action. - Der Rückgabetyp ist entweder abgeleitet oder ein expliziter Typ. Ein mithilfe des Schlüsselworts
vardeklarierter Rückgabetyp ist nicht zulässig.
Lambda-Ausdrucksdelegattyp
- CS9099: Warnung: Der Standardwert des Parameters stimmt nicht mit dem Zieldelegattyp überein.
Wenn Sie einen Standardwert deklarieren oder den params-Modifizierer mit einem Lambda-Ausdrucksparameter hinzufügen, ist der Delegattyp keiner der Func- oder Action-Typen. Stattdessen ist es ein benutzerdefinierter Typ, der einen Standardparameterwert oder params Modifikator enthält. Der folgende Code generiert Warnungen, da er einem Typ einen Lambda-Ausdruck zuweist Action , 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 typierte 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) => { };