Dela via


Fel och varningar när du använder lambda-uttryck och anonyma funktioner

Flera fel gäller att deklarera och använda lambda-uttryck och anonyma metoder:

  • CS0407: "metoden" har fel returtyp.
  • CS0428: Det går inte att konvertera metodgruppen "Identifierare" till typen "typ" som inte delegeras. Har du för avsikt att anropa metoden?
  • CS0748: Inkonsekvent lambda-parameteranvändning. Parametertyperna måste vara explicita eller implicita.
  • CS0815: Det går inte att tilldela uttrycket till en implicit typvariabel.
  • CS0828: Det går inte att tilldela uttrycket till egenskapen anonym typ.
  • CS0837: Den första operanden för operatorn "is" eller "as" kanske inte är ett lambda-uttryck, en anonym metod eller en metodgrupp.
  • CS1065: Standardvärdena är inte giltiga i den här kontexten.
  • 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.
  • CS1643: Alla kodsökvägar returnerar inte ett värde i anonym metod av typen "typ".
  • CS1660: Det går inte att konvertera lambda-uttrycket till typen "type" eftersom det inte är en ombudstyp.
  • CS1661: Det går inte att konvertera anonyma metodblock för att skriva "typ" eftersom parametertyperna inte matchar de delegerade parametertyperna.
  • CS1662: Det går inte att konvertera anonymt metodblock till avsedd ombudstyp eftersom vissa returtyper i blocket inte implicit kan konverteras till ombudets returtyp.
  • CS1673: Anonyma metoder, lambda-uttryck och frågeuttryck i structs kan inte komma åt instansmedlemmar i "this".
  • CS1676: Parametern "number" måste deklareras med nyckelordet "nyckelord".
  • CS1677: Parametern "number" ska inte deklareras med nyckelordet "nyckelord".
  • CS1678: Parametern "number" deklareras som typen "type1" men ska vara "type2".
  • CS1686: Lokal variabel eller dess medlemmar kan inte få sin adress tagen och användas i en anonym metod eller lambda-uttryck.
  • CS1688: Det går inte att konvertera ett anonymt metodblock utan en parameterlista till delegeringstyp eftersom den har en eller flera out-parametrar.
  • CS1706: Uttrycket får inte innehålla anonyma metoder eller lambda-uttryck.
  • CS1731: Det går inte att konvertera uttryck till ombud eftersom vissa av returtyperna i blocket inte implicit kan konverteras till ombudets returtyp.
  • CS1732: Förväntad parameter.
  • CS1764: Det går inte att använda fast lokal plats i en anonym metod, ett lambda-uttryck eller ett frågeuttryck.
  • 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.
  • CS8820: En statisk anonym funktion kan inte innehålla en referens till variabeln.
  • CS8821: En statisk anonym funktion kan inte innehålla en referens till "this" eller "base".
  • CS8916: Attribut för lambda-uttryck kräver en parenteserad parameterlista.
  • CS8917: Det gick inte att härleda delegetypen.
  • CS8934: Det går inte att konvertera anonym metod till typen 'typ' eftersom returtypen inte matchar delegeringens returtyp.
  • 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 gäller flera varningar med avseende på deklarationen och användningen av lambda-uttryck:

  • CS0467: Tvetydighet mellan metoden "metod" och icke-metoden "icke-metod". Metodgruppen används.
  • CS1911: Åtkomst till medlem via ett "grundläggande" nyckelord från en anonym metod, lambda-uttryck, frågeuttryck eller iterator resulterar i icke-verifierad kod.
  • CS8971: InterpolatedStringHandlerArgument har ingen effekt när det tillämpas på lambda-parametrar och ignoreras på anropsplatsen.
  • CS8974: Konvertera metodgruppen "metod" till typen "type" som inte delegeras. Har du för avsikt att anropa metoden?
  • 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

  • CS0837: Den första operanden för en is eller as operator får inte vara ett lambda-uttryck, en anonym metod eller en metodgrupp.
  • 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.
  • CS1706: Uttrycket får inte innehålla anonyma metoder eller lambda-uttryck.
  • CS1764: Det går inte att använda fast lokal plats i en anonym metod, ett lambda-uttryck eller ett frågeuttryck.
  • CS1911: Varning: Åtkomst till medlem via ett "grundläggande" nyckelord från en anonym metod, lambda-uttryck, frågeuttryck eller iterator resulterar i icke-verifierad kod.
  • CS8175: Det går inte att använda referens lokalt i en anonym metod, lambda-uttryck eller frågeuttryck.
  • CS8820: En statisk anonym funktion kan inte innehålla en referens till variabeln.
  • CS8821: En statisk anonym funktion kan inte innehålla en referens till "this" eller "base".
  • CS8971: Varning: InterpolatedStringHandlerArgument har ingen effekt när det tillämpas på lambda-parametrar och ignoreras på anropsplatsen.
  • CS9236: Information: 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.

Kompilatorn förbjuder vissa C#-konstruktioner i lambda-uttryck och anonyma metoder. Dessa begränsningar finns eftersom kompilatorn omvandlar lambdas och anonyma metoder till delegerade anrop eller uttrycksträd, och vissa konstruktioner kan inte representeras i dessa formulär. Mer information finns i avsnittet anonyma funktionsuttryck i C#-specifikationen.

Du kan åtgärda dessa fel med hjälp av följande vägledning:

  • Flytta någon yield return eller yield break -instruktionen från lambda-brödtexten och till den omslutande iteratormetoden, eller konvertera lambda till en lokal funktion, som stöder yield instruktioner (CS1621).
  • Undvik att referera till in, ref eller out parametrar från den omslutande metoden i lambda-uttrycket. När lambda fångar dessa parametrar som en del av en closure kan referenssemantiken för ref-liknande parametrar inte bevaras. Kopiera värdet till en lokal variabel och använd det lokala i stället, eller konvertera lambda till en lokal funktion (CS1628).
  • Ta bort alla break, goto, eller continue -instruktioner som överför kontrollen från lambda-brödtexten. Kontrollflödesinstruktioner måste referera till etiketter eller loopar inom samma lambda-kropp (CS1632).
  • För en struct-typ, undvik att referera till instansmedlemmar genom this i ett lambda-uttryck, en anonym metod eller ett frågeuttryck. Eftersom kompilatorn samlar in this efter värde i en structpåverkar mutationer i lambda inte den ursprungliga instansen. Extrahera nödvändiga medlemsvärden till lokala variabler före lambda eller konvertera till en lokal funktion som kan komma åt this direkt (CS1673).
  • Ta inte adressen till en lokal variabel som lambda också samlar in. Kompilatorn flyttar insamlade variabler till ett heapallokerat stängningsobjekt, vilket gör deras adress instabil. Separera den adresstagande logiken från lambda eller använd en lokal funktion i stället (CS1686).
  • Flytta lambda-uttrycket eller den anonyma metoden från det innehållande uttrycket som förbjuder det. Vissa uttryck, till exempel attributkonstruktorer, stöder inte lambda-uttryck eller anonyma metoder som argument (CS1706).
  • Använd inte en fixed lokal variabel inuti en lambdakropp. Pinningsgarantin för -instruktionenfixed gäller endast för det omslutande omfånget, inte för den slutning som kompilatorn genererar (CS1764).
  • Använd inte en ref lokal i ett lambda-uttryck. Precis som ref parametrar, ref lokala variabler kan inte fångas i slutningen som kompilatorn genererar för den lambda. Tilldela värdet till en icke-lokalref variabel eller konvertera lambda till en lokal funktion (CS8175).
  • Använd inte ett lambda-uttryck, en anonym metod eller en metodgrupp som den första operanden för operatorn is eller as . De här konstruktionerna har ingen typ som kan testas vid körning. Tilldela uttrycket till en variabel först och testa sedan variabeln (CS0837).
  • static Ta bort modifieraren från lambda eller ta bort referensen till den insamlade variabeln. En static lambda förbjuder uttryckligen insamling av lokala variabler, parametrar eller this för att undvika oavsiktliga stängningsallokeringar. Om du behöver referera till yttre variabler tar du bort static modifieraren. Om du vill hålla heap-allokeringen minimal skickar du värdena som parametrar till lambda (CS8820, CS8821).
  • InterpolatedStringHandlerArgumentAttribute Ta bort från lambda-parametern eller flytta logiken till en metod där attributet respekteras. Kompilatorn ignorerar det här attributet på lambda-parametrar eftersom lambda-anrop inte använder samma interpolerade stränghanterare som sänker som vanliga metodanrop (CS8971).
  • Undvik att anropa en virtuell medlem via nyckelordet base i en lambda- eller anonym metod. Kompilatorn genererar ett icke-virtuellt anrop via en hjälpmetod som genererar icke-verifierad kod. Överväg att extrahera anropet base till en separat metod och anropa den metoden från lambda i stället (CS1911).
  • Minska komplexiteten för överlagrade metodanrop som accepterar lambda-uttryck eller lägg till explicit typinformation. När kompilatorn måste binda ett lambda-uttryck flera gånger för att lösa överladdningar genererar den här informativa diagnostiken. Om du deklarerar lambda med explicita parametertyper eller anger explicita typargument för det generiska metodanropet, minskar antalet bindningspass som kompilatorn måste utföra (CS9236).

Lambda-uttrycksparametrar och returvärden

  • CS0748: Inkonsekvent lambda-parameteranvändning. Parametertyperna måste vara explicita eller implicita.
  • CS1065: Standardvärdena är inte giltiga i den här kontexten.
  • CS1643: Alla kodsökvägar returnerar inte ett värde i anonym metod av typen "typ".
  • CS1661: Det går inte att konvertera anonyma metodblock för att skriva "typ" eftersom parametertyperna inte matchar de delegerade parametertyperna.
  • CS1662: Det går inte att konvertera anonymt metodblock till avsedd ombudstyp eftersom vissa returtyper i blocket inte implicit kan konverteras till ombudets returtyp.
  • CS1676: Parametern "number" måste deklareras med nyckelordet "nyckelord".
  • CS1677: Parametern "number" ska inte deklareras med nyckelordet "nyckelord".
  • CS1678: Parametern "number" deklareras som typen "type1" men ska vara "type2".
  • CS1688: Kan inte konvertera anonym metodblock utan parameterlista till delegattypen 'delegat' eftersom den har en eller flera ut-parametrar.
  • CS1731: Det går inte att konvertera uttryck till ombud eftersom vissa av returtyperna i blocket inte implicit kan konverteras till ombudets returtyp.
  • CS1732: Förväntad parameter.
  • 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.
  • CS8934: Det går inte att konvertera en anonym metod till typen 'typ' eftersom returtypen inte matchar delegatens returtyp.
  • CS8975: Det kontextuella nyckelordet var kan inte användas som explicit lambda-returtyp.
  • CS9098: Implicit skrivet lambda-parametern "..." kan inte ha ett standardvärde.

Dessa fel indikerar ett problem med en lambda-uttrycksparameter eller returtypdeklaration. Fullständiga regler för lambda-parameter och returtyper finns i lambda-uttryck, anonyma metoder och avsnittet anonyma funktionsuttryck i C#-specifikationen.

Anmärkning

CS1731 och CS1732 produceras inte längre av den aktuella versionen av C#-kompilatorn (Roslyn). De kan visas om du använder en äldre kompilatorversion.

Du kan åtgärda dessa fel med hjälp av följande vägledning:

  • Se till att alla parametrar i ett lambda-uttryck använder samma typformat. När en lambda har flera parametrar måste varje parameter antingen uttryckligen skrivas eller skrivas implicit – du kan inte blanda de två formaten i samma parameterlista (CS0748).
  • Lägg till explicita typer till valfri lambda-parameter som har ett standardvärde. Kompilatorn kräver explicita typer av parametrar med standardvärden eftersom den måste generera en anpassad ombudstyp som kodar standardvärdet. Implicit inskrivna parametrar ger inte tillräckligt med information för kompilatorn för att konstruera den delegerade typen (CS1065, CS9098).
  • Ta bort standardparametervärden från anonyma metoder som deklareras med hjälp av operatorndelegate. Standardparametervärden stöds endast i lambda-uttryck, inte i anonyma metoder. Konvertera den anonyma metoden till ett lambda-uttryck om du behöver standardvärden (CS1065).
  • Matcha parametertyperna, ref/out/inmodifierarna och parameterantalet för lambda- eller anonymmetoden med måldelegattypen. Kompilatorn utför en exakt matchning av parametersignaturer när en anonym funktion konverteras till ett ombud: varje parameter måste ha rätt typ, och alla ref, outeller in modifierare måste finnas exakt när ombudet förväntar sig det (CS1661, CS1676, CS1677, CS1678).
  • Lägg till en parameterlista i den anonyma metoden när måldelegattypen har out parametrar. En anonym metod som deklareras utan en parameterlista (med hjälp delegate { } av syntax) kan matcha de flesta delegattyper, men kompilatorn kan inte syntetisera de obligatoriska out parametrarna implicit. Deklarera parametrarna explicit för att matcha ombudets signatur (CS1688).
  • Se till att alla kodsökvägar i lambda- eller anonym-metoden returnerar ett värde när måldelegattypen har en returtyp som inte är tom. Varje gren genom kroppens struktur måste generera ett returvärde som implicit kan konverteras till delegatens returtyp (CS1643, CS1662, CS1731, CS8934).
  • Ta bort en return-instruktion med ett värde från en lambda- eller anonym metod som har tilldelats en void-returnerande delegattyp, till exempel Action. Eftersom ombudets returtyp är voidkan brödtexten inte returnera ett värde (CS8030).
  • Omslut parameterlistan i parenteser när attribut tillämpas på valfri lambda-parameter. Kompilatorn behöver det parentesiserade formuläret för att skilja attributsyntax från andra uttryck. Skriv till exempel ([MyAttribute] int x) => x i stället för [MyAttribute] x => x (CS8916).
  • Använd ett specifikt typnamn i stället för var som explicit returtyp för ett lambda-uttryck. Nyckelordet var är reserverat för implicit inskrivna lokala variabler och kan inte användas som en lambda-returtypanteckning. Ange den faktiska returtypen eller utelämna returtypen och låt kompilatorn härleda den (CS8975).
  • Åtgärda parameterlistan så att kompilatorn kan identifiera den som en giltig parameterdeklaration. Det här felet anger en felformad parameterlista där kompilatorn förväntade sig en parameteridentifierare men hittade något annat (CS1732).

Lambda-uttrycksdelegattyp

  • CS0407: "metoden" har fel returtyp.
  • CS0428: Det går inte att konvertera metodgruppen "Identifierare" till typen "typ" som inte delegeras. Har du för avsikt att anropa metoden?
  • CS0467: Varning: Tvetydighet mellan metoden "metod" och icke-metoden "icke-metod". Metodgruppen används.
  • CS0815: Det går inte att tilldela uttrycket till en implicit typvariabel.
  • CS0828: Det går inte att tilldela uttrycket till egenskapen anonym typ.
  • CS1660: Det går inte att konvertera lambda-uttrycket till typen "type" eftersom det inte är en ombudstyp.
  • CS8917: Det gick inte att härleda delegetypen.
  • CS8974: Varning: Konvertera metodgruppen "metod" till typen "type" som inte delegeras. Har du för avsikt att anropa metoden?
  • CS9099: Varning: Standardparametervärdet matchar inte måldelegattypen.
  • CS9100: Varning: Parametern har paramsmodifierare i lambda men inte i måldelegattypen.

Dessa fel indikerar ett problem med den delegattyp som kompilatorn härleder eller förväntar sig för ett lambda-uttryck, en anonym metod eller en metodgrupp. Fullständiga regler för delegerade konverteringar finns i lambda-uttryck, anonyma metoder och avsnittet anonyma funktionsuttryck i C#-specifikationen.

Anmärkning

Den aktuella versionen av C#-kompilatorn (Roslyn) producerar inte CS0467. Du kan se det här felet om du använder en äldre kompilatorversion.

Du kan åtgärda dessa fel med hjälp av följande vägledning:

  • Kontrollera att måltypen för tilldelningen eller konverteringen är en ombudstyp eller System.Linq.Expressions.Expression. Ett lambda-uttryck eller en anonym metod kan inte tilldelas till en icke-delegerad typ, till exempel object eller ett gränssnitt. Ändra variabelns typ till en kompatibel ombudstyp som Func<> eller Action<>, eller använd var för att låta kompilatorn härleda ombudstypen (CS1660).
  • Ange tillräckligt med kontext för kompilatorn för att fastställa en enda delegattyp för lambda-uttrycket. När var tilldelas behöver kompilatorn en entydig returtyp och parameterlista. När den tilldelas till en anonym typegenskap kan kompilatorn inte härleda någon delegattyp alls. Tilldela lambda till en variabel med en explicit ombudstyp och använd sedan variabeln i den anonyma typinitieraren (CS0815, CS0828, CS8917).
  • Matcha returtypen för metodgruppen med ombudets deklarerade returtyp. En metodgruppkonvertering kräver att metodens returtyp är identitetskonverterad eller implicit konvertibel till ombudets returtyp. Ändra metodens returtyp eller ändra ombudstypen så att den matchar (CS0407).
  • Anropa metoden i stället för att tilldela metodgruppen när måltypen inte är ett ombud. Om måltypen är string, inteller en annan typ som inte är delegerad, tänkte du förmodligen anropa metoden och tilldela dess resultat. Lägg till parenteser och argument för att anropa metoden (CS0428, CS8974).
  • Lös tvetydighet mellan en metod och en icke-metodmedlem som delar samma namn. Byt namn på en av de medlemmar som är i konflikt eller använd en fullständigt kvalificerad referens för att ta bort tvetydigheten (CS0467).
  • Ta bort standardparametervärdet eller params modifieraren från lambda när måldelegattypen är en standard Func<> eller Action<> typ. Standardvärden och params modifierare gör att kompilatorn genererar en anpassad ombudstyp som inte matchar Func<> eller Action<>. var Använd antingen för att låta kompilatorn syntetisera rätt ombudstyp eller ta bort standardvärdet eller params modifieraren så att lambda matchar den deklarerade delegattypen (CS9099, CS9100).