Delen 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 inref of out parameter niet gebruiken binnen een anonieme methode, lambda-expressie of query-expressie.
  • CS1632: De besturing kan het lichaam 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 zijn leden kunnen hun adres niet verkrijgen en worden niet gebruikt binnen een anonieme methode of lambda-uitdrukking.
  • CS1706: Expressie kan geen anonieme methoden of lambda-expressies bevatten.
  • CS8030: Anonieme functie geconverteerd naar een void-terugkerende gedelegeerde 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.

De compiler produceert ook het volgende informatieve bericht:

  • CS9236: Compiling vereist dat de lambda-expressie ten minste aantal keren wordt gebonden. Overweeg om de lambda-expressie te declareren met expliciete parametertypen, of als de aanroep van de methode algemeen is, overweeg dan expliciete typeargumenten te gebruiken.

Syntaxisbeperkingen in lambda-expressies

Sommige C#-syntaxis is niet toegestaan 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 in, ref of out parameter niet binnen een anonieme methode, lambda-expressie of query-expressie gebruiken.
  • CS1632: Controle kan het lichaam 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: Het adres van een lokale variabele of zijn leden kan niet worden genomen en 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 statements (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.

Bepaalde expressies zorgen ervoor dat de compiler de volgende informatieve waarschuwing verzendt:

  • CS9236: Compiling vereist dat de lambda-expressie ten minste aantal keren wordt gebonden. Overweeg om de lambda-expressie te declareren met expliciete parametertypen, of als de aanroep van de methode algemeen is, overweeg dan expliciete typeargumenten te gebruiken.

De complexiteit van de lambda-expressies en hoe ze andere lambda-expressies aanroepen, heeft een negatieve invloed op de prestaties van de compiler. De reden hiervoor is dat de compiler parameter- en argumenttypen moet afleiden via de lambda-expressies en dat de mogelijke typen tijd in beslag nemen.

Lambda-expressieparameters en -retourwaarden

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 delegate die geen waarde retourneert 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 is óf afgeleid, óf van 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-modifier toevoegt met een lambda-expressieparameter, is het type delegate niet een van de Func- of Action-typen. 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) => { };