Dela via


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 inref eller out 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, refeller out 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 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:

  • yield statements (yield return eller yield break)
  • Anropa en metod som har parametern in, refeller out
  • ref lokala variabler
  • break, gotooch continue -instruktioner
  • this åtkomst när this är en struct 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 exempel Action.
  • 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) => { };