Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis 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) => { };