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
in
ref
ofout
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 ,
ref
ofout
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
ofyield break
)- Een methode aanroepen die een
in
,ref
ofout
parameter heeft ref
lokale variabelenbreak
,goto
encontinue
instructiesthis
toegang wanneerthis
eenstruct
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, zoalsAction
. - 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) => { };