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. Alle Parametertypen müssen entweder explizit oder implizit sein.
  • CS1621: Die yield-Anweisung kann nicht in einer anonymen Methode oder einem Lambdaausdruck verwendet werden.
  • CS1628: Der in-, ref- oder out-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.
  • CS1706: Ausdruck kann 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 „...“ der Lambdafunktion darf keinen Standardwert aufweisen.

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- oder out-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.

Die folgenden Konstrukte sind in Lambdaausdrücken alle unzulässig:

  • yield-Anweisungen (yield return oder yield break)
  • Aufrufen einer Methode mit einem in-, ref- oder out-Parameter
  • Lokale ref-Variablen
  • break-, goto- und continue-Anweisungen
  • this-Zugriff, wenn this ein struct-Typ ist
  • Anonyme Methoden oder Lambdaausdrücke in einem anderen Ausdruck, z. B. einem Attributkonstruktor.

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. Alle Parametertypen müssen entweder explizit oder implizit sein.
  • CS9098: Der implizit eingegebene Parameter „...“ 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) => { };