Share via


Fouten en waarschuwingen bij het gebruik van lambda-expressies en anonieme functies

Er zijn verschillende fouten met betrekking tot het declareren en gebruiken van lambda-expressies:

  • CS0748: Inconsistent lambda parametergebruik; parametertypen moeten allemaal expliciet of allemaal impliciet zijn.
  • CS1621: De rendementsinstructie kan niet worden gebruikt binnen een anonieme methode of lambda-expressie.
  • CS1628: Kan geen anonieme methode, lambda-expressie of query-expressie gebruiken inref of out parameter gebruiken.
  • CS1632: Besturingselement kan de hoofdtekst van een anonieme methode of lambda-expressie niet verlaten.
  • CS1673: Anonieme methoden, lambda-expressies en query-expressies in structs hebben geen toegang tot exemplaarleden van 'dit'.
  • CS1686: Lokale variabele of de leden kunnen hun adres niet gebruiken en worden gebruikt binnen een anonieme methode of lambda-expressie.
  • CS1706: Expressie kan geen anonieme methoden of lambda-expressies bevatten.
  • CS8030: Anonieme functie geconverteerd naar een ongeldige geretourneerde gemachtigde kan geen waarde retourneren.
  • CS8175: Kan geen lokale verwijzing gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.
  • CS8916: Kenmerken voor lambda-expressies vereisen een lijst met haakjes.
  • CS8971: InterpolatedStringHandlerArgument heeft geen effect wanneer deze wordt toegepast op lambda-parameters en wordt genegeerd op de oproepsite.
  • CS8975: Het contextuele trefwoord var kan niet worden gebruikt als een expliciet lambda-retourtype.
  • CS9098: Impliciet getypt lambda parameter '...' kan geen standaardwaarde hebben.

Daarnaast zijn er verschillende waarschuwingen met betrekking tot het declareren en gebruiken van lambda-expressies:

  • CS8971: InterpolatedStringHandlerArgument heeft geen effect wanneer deze wordt toegepast op lambda-parameters en wordt genegeerd op de oproepsite.
  • CS9099: De standaardparameterwaarde komt niet overeen met het type doeldelegatie.
  • CS9100: Parameter heeft params modifier in lambda, maar niet in doel gedelegeerde type.

Syntaxisbeperkingen in lambda-expressies

Sommige C#-syntaxis is verboden in lambda-expressies en anonieme methoden. Het gebruik van ongeldige constructies in een lambda-expressie veroorzaakt de volgende fouten:

  • CS1621: De yield instructie kan niet worden gebruikt binnen een anonieme methode of lambda-expressie.
  • CS1628: Kan geen , refof out parameter binnen een anonieme methode, lambda-expressie of query-expressie gebruikenin.
  • CS1632: Besturingselement kan de hoofdtekst van een anonieme methode of lambda-expressie niet verlaten.
  • CS1673: Anonieme methoden, lambda-expressies en query-expressies in structs hebben geen toegang tot exemplaarleden van this.
  • CS1686: Lokale variabele of de leden kunnen hun adres niet gebruiken en worden gebruikt binnen een anonieme methode of lambda-expressie.
  • CS8175: Kan geen lokale verwijzing gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.

Alle volgende constructies zijn niet toegestaan in lambda-expressies:

  • yield instructies (yield return of yield break)
  • Een methode aanroepen die een in, refof out parameter heeft
  • ref lokale variabelen
  • break, gotoen continue instructies
  • this toegang wanneer this een struct type is
  • Anonieme methoden of lambda-expressies in een andere expressie, zoals een kenmerkconstructor.

U kunt geen van deze constructies gebruiken in een lambda-expressie of een anonieme methode. Veel zijn toegestaan in een lokale functie.

Bovendien worden geïnterpoleerde tekenreekshandlertypen genegeerd wanneer ze worden toegepast op een lambda-parameter. Als u er een gebruikt, ziet u de volgende waarschuwing:

  • CS8971: InterpolatedStringHandlerArgument heeft geen effect wanneer deze wordt toegepast op lambda-parameters en wordt genegeerd op de oproepsite.

Lambda-expressieparameters en retourneert

Deze fouten geven een probleem aan met een parameterdeclaratie:

  • CS0748: Inconsistent lambda parametergebruik; parametertypen moeten allemaal expliciet of allemaal impliciet zijn.
  • CS9098: Impliciet getypt lambda parameter '...' kan geen standaardwaarde hebben.
  • CS8030: Anonieme functie geconverteerd naar een ongeldige geretourneerde gemachtigde kan geen waarde retourneren.
  • CS8916: Kenmerken voor lambda-expressies vereisen een lijst met haakjes.
  • CS8975: Het contextuele trefwoord var kan niet worden gebruikt als een expliciet lambda-retourtype.

Lambda-expressieparameters moeten de volgende regels volgen:

  • Wanneer een lambda-expressie meerdere parameters heeft, moeten alle parameters expliciet worden getypt of moeten alle parameters impliciet worden getypt.
  • Alle lambda-parameters met een standaardwaarde moeten expliciet worden getypt.
  • Als kenmerken worden toegepast op parameters, moet de lijst met parameters tussen haakjes worden geplaatst.

Retourtypen van lambda-expressies moeten de volgende regels volgen:

  • Een lambda-expressie die een waarde retourneert, kan niet worden geconverteerd naar een void terugkerende gemachtigde, zoals Action.
  • Het retourtype wordt afgeleid of een expliciet type. Een retourtype dat is gedeclareerd met het trefwoord var , is niet toegestaan.

Gedelegeerde type Lambda-expressie

  • CS9099: Waarschuwing: de standaardparameterwaarde komt niet overeen met het type doeldelegatie.

Wanneer u een standaardwaarde declareert of de params wijzigingsfunctie toevoegt met een lambda-expressieparameter, is het type gemachtigde niet een van de of Action typenFunc. In plaats daarvan is het een aangepast type dat de standaardparameterwaarde of params modifier bevat. Met de volgende code worden waarschuwingen gegenereerd omdat er een lambda-expressie met een standaardparameter wordt toegewezen aan een Action type:

Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };

Als u de fout wilt oplossen, verwijdert u de standaardparameter of gebruikt u een impliciet getypte variabele voor het gemachtigdetype:

Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };