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- 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 - 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- 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.
  • CS9170 - Eine Ausdrucksstruktur darf keinen Inlinearrayzugriff oder keine -Konvertierung enthalten

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.
  • 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) => { };