Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 inrefelleroutparameter 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 varkan 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.
Kompilatorn skapar också följande informationsmeddelande :
- CS9236: Kompilering kräver bindning av lambda-uttrycket minst antal gånger. Överväg att deklarera lambda-uttrycket med explicita parametertyper, eller om det innehållande metodanropet är generiskt bör du överväga att använda explicita typargument.
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 yieldkan inte användas i en anonym metod eller lambda-uttryck.
- 
              CS1628: Kan inte använda in,refelleroutparameter 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 thisi .
- 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:
- 
              yieldsatser (yield returnelleryield break)
- Anropa en metod som har parametern in,refellerout
- 
              reflokala variabler
- 
              break,gotoochcontinue-instruktioner
- 
              thisåtkomst närthisär enstructtyp
- 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, visas följande varning:
- CS8971: InterpolatedStringHandlerArgument har ingen effekt när det tillämpas på lambda-parametrar och ignoreras på anropsplatsen.
Vissa uttryck gör att kompilatorn genererar följande informationsvarning:
- CS9236: Kompilering kräver bindning av lambda-uttrycket minst antal gånger. Överväg att deklarera lambda-uttrycket med explicita parametertyper, eller om det innehållande metodanropet är generiskt bör du överväga att använda explicita typargument.
Lambda-uttryckens komplexitet och hur de anropar andra lambda-uttryck påverkar kompilatorns prestanda negativt. Anledningen är att kompilatorn måste härleda parameter- och argumenttyper via lambda-uttrycken och de potentiella typerna tar tid.
Lambda-uttrycksparametrar och returvärden
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 voidreturnerande ombud, till exempelAction.
- Returtypen är antingen härledd eller en explicit typ. En returtyp som deklareras med nyckelordet vartillå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) => { };