Freigeben über


Fehler und Warnungen bei Verwendung von Lambda-Ausdrücken und anonymen Funktionen

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 inref oder out kö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 var kann 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 yield Anweisung kann nicht innerhalb einer anonymen Methode oder eines Lambda-Ausdrucks verwendet werden.
  • CS1628: Kann den Parameter in, ref oder out nicht 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:

  • yield Anweisungen (yield return oder yield break)
  • Aufrufen einer Methode mit einem in, refoder out Parameter
  • ref Lokale Variablen
  • break-, goto- und continue-Anweisungen
  • this Zugriff, wenn this es sich um einen struct Typ 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 var deklarierter 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) => { };