Fel och varningar när du använder lambda-uttryck och anonyma funktioner
Det finns flera fel som rör att deklarera och använda lambda-uttryck:
- CS0748: Inkonsekvent lambda-parameteranvändning. Parametertyperna måste vara explicita eller implicita.
- CS1621: Yield-instruktionen kan inte användas i en anonym metod eller lambda-uttryck.
- CS1628: Kan inte använda
in
ref
ellerout
parameter i en anonym metod, lambda-uttryck eller frågeuttryck. - CS1632: Kontrollen kan inte lämna brödtexten för en anonym metod eller lambda-uttryck.
- CS1673: Anonyma metoder, lambda-uttryck och frågeuttryck i structs kan inte komma åt instansmedlemmar i "this".
- CS1686: Lokal variabel eller dess medlemmar kan inte få sin adress tagen och användas i en anonym metod eller lambda-uttryck.
- CS1706: Uttrycket får inte innehålla anonyma metoder eller lambda-uttryck.
- CS8030: Anonym funktion som konverterats till ett ogiltigt returdelegat kan inte returnera ett värde.
- CS8175: Det går inte att använda referens lokalt i en anonym metod, lambda-uttryck eller frågeuttryck.
- CS8916: Attribut för lambda-uttryck kräver en parenteserad parameterlista.
- CS8971: InterpolatedStringHandlerArgument har ingen effekt när det tillämpas på lambda-parametrar och ignoreras på anropsplatsen.
- CS8975: Det kontextuella nyckelordet
var
kan inte användas som en explicit lambda-returtyp. - CS9098: Implicit skrivet lambda-parametern "..." kan inte ha ett standardvärde.
Dessutom finns det flera varningar relaterade till att deklarera och använda lambda-uttryck:
- CS8971: InterpolatedStringHandlerArgument har ingen effekt när det tillämpas på lambda-parametrar och ignoreras på anropsplatsen.
- CS9099: Standardparametervärdet matchar inte i måldelegattypen.
- CS9100: Parametern har paramsmodifierare i lambda men inte i måldelegattypen.
Syntaxbegränsningar i lambda-uttryck
Vissa C#-syntaxer är förbjudna i lambda-uttryck och anonyma metoder. Om du använder ogiltiga konstruktioner i ett lambda-uttryck uppstår följande fel:
- CS1621: Instruktionen
yield
kan inte användas i en anonym metod eller lambda-uttryck. - CS1628: Kan inte använda
in
,ref
ellerout
parameter i en anonym metod, lambda-uttryck eller frågeuttryck. - CS1632: Kontrollen kan inte lämna brödtexten för en anonym metod eller lambda-uttryck.
- CS1673: Anonyma metoder, lambda-uttryck och frågeuttryck i structs kan inte komma åt instansmedlemmar
this
i . - CS1686: Lokal variabel eller dess medlemmar kan inte få sin adress tagen och användas i en anonym metod eller lambda-uttryck.
- CS8175: Det går inte att använda referens lokalt i en anonym metod, lambda-uttryck eller frågeuttryck.
Alla följande konstruktioner tillåts inte i lambda-uttryck:
yield
statements (yield return
elleryield break
)- Anropa en metod som har parametern
in
,ref
ellerout
ref
lokala variablerbreak
,goto
ochcontinue
-instruktionerthis
åtkomst närthis
är enstruct
typ- Anonyma metoder eller lambda-uttryck i ett annat uttryck, till exempel en attributkonstruktor.
Du kan inte använda någon av dessa konstruktioner i ett lambda-uttryck eller en anonym metod. Många tillåts i en lokal funktion.
Dessutom ignoreras interpolerade stränghanterartyper när de tillämpas på en lambda-parameter. Om du använder en varning visas följande varning:
- CS8971: InterpolatedStringHandlerArgument har ingen effekt när det tillämpas på lambda-parametrar och ignoreras på anropsplatsen.
Lambda-uttrycksparametrar och returnerar
Dessa fel indikerar ett problem med en parameterdeklaration:
- CS0748: Inkonsekvent lambda-parameteranvändning. Parametertyperna måste vara explicita eller implicita.
- CS9098: Implicit skrivet lambda-parametern "..." kan inte ha ett standardvärde.
- CS8030: Anonym funktion som konverterats till ett ogiltigt returdelegat kan inte returnera ett värde.
- CS8916: Attribut för lambda-uttryck kräver en parenteserad parameterlista.
- CS8975: Det kontextuella nyckelordet var kan inte användas som explicit lambda-returtyp.
Lambda-uttrycksparametrar måste följa dessa regler:
- När ett lambda-uttryck har flera parametrar måste antingen alla parametrar skrivas explicit eller så måste alla parametrar vara implicit inskrivna.
- Alla lambda-parametrar med ett standardvärde måste uttryckligen skrivas.
- Om attribut tillämpas på några parametrar måste parameterlistan omges av parenteser.
Returtyper av lambda-uttryck måste följa dessa regler:
- Ett lambda-uttryck som returnerar ett värde kan inte konverteras till ett
void
returnerande ombud, till exempelAction
. - Returtypen är antingen härledd eller en explicit typ. En returtyp som deklareras med nyckelordet
var
tillåts inte.
Lambda-uttrycksdelegattyp
- CS9099: Varning: Standardparametervärdet matchar inte måldelegattypen.
När du deklarerar ett standardvärde eller lägger till params
modifieraren med en lambda-uttrycksparameter är ombudstypen inte en av typerna Func
eller Action
. I stället är det en anpassad typ som innehåller standardparametervärdet eller params
modifieraren. Följande kod genererar varningar eftersom den tilldelar ett lambda-uttryck som har en standardparameter till en Action
typ:
Action<int> a1 = (int i = 2) => { };
Action<string[]> a3 = (params string[] s) => { };
Åtgärda felet genom att antingen ta bort standardparametern eller använda en implicit typvariabel för ombudstypen:
Action<int> a1 = (int i) => { };
var a2 = (int i = 2) => { };
Action<string[]> a3 = (string[] s) => { };
var a4 = (params string[] s) => { };