Fel och varningar relaterade till instruktions yield return
- och iteratormetoder
Det finns många fel relaterade till instruktions yield return
- och iteratormetoderna:
- CS1622: Det går inte att returnera ett värde från en iterator. Använd avkastningsreturutdraget för att returnera ett värde eller en avkastningsbrytning för att avsluta iterationen.
- CS1624: Brödtexten för "accessor" kan inte vara ett iteratorblock eftersom "typ" inte är en iteratorgränssnittstyp
- CS1625: Kan inte ge resultat i brödtexten i en slutsats
- CS1626: Det går inte att ge ett värde i brödtexten i ett försöksblock med en catch-sats
- CS1627: Uttryck som förväntas efter avkastningsretur
- CS1629: Osäker kod kanske inte visas i iteratorer
- CS1631: Det går inte att ge ett värde i brödtexten i en catch-sats
- CS1637: Iteratorer kan inte ha osäkra parametrar eller avkastningstyper
- CS4013: Instans av typen kan inte användas i en kapslad funktion, frågeuttryck, iteratorblock eller asynkron metod
- CS8154: Brödtexten kan inte vara ett iteratorblock eftersom den returneras med referens
- CS8176: Iteratorer kan inte ha lokala efterreferenser
- CS9238: Det går inte att använda "avkastningsretur" i ett "osäkert" block
-
CS9239: Operatorn
&
kan inte användas på parametrar eller lokala variabler i iteratormetoder.
En iteratormetod måste följa flera regler i C#. Kompilatorn utfärdar följande fel när iteratormetoden bryter mot en eller flera av dessa regler:
- CS1622: Det går inte att returnera ett värde från en iterator. Använd avkastningsreturutdraget för att returnera ett värde eller en avkastningsbrytning för att avsluta iterationen.
- CS1624: Brödtexten för "accessor" kan inte vara ett iteratorblock eftersom "typ" inte är en iteratorgränssnittstyp
- CS1627: Uttryck som förväntas efter avkastningsretur
- CS1637: Iteratorer kan inte ha osäkra parametrar eller avkastningstyper
- CS8154: Brödtexten kan inte vara ett iteratorblock eftersom den returneras med referens
Iteratormetoden måste följa följande regler:
- En iteratormetod (med och
yield return
eventuelltyield break
) kan inte också använda enreturn
-instruktion för att returnera en sekvens. - En iteratormetod måste deklarera en iteratorgränssnittstyp som returtyp. Iteratorgränssnittstyperna är: IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T>.
- En
yield return
instruktion måste innehålla ett uttryck som ska returneras som en del av en sekvens.yield return;
är inte giltig. - En iteratormetod kan inte använda osäkra typer som parametrar, till exempel pekare.
- En iteratormetod kan inte
yield return
vara osäker, till exempel pekare. - En iteratormetod kan inte
yield return
medref
. Du måste returnera med värde.
En iteratormetods brödtext måste överensstämma med begränsningarna för -instruktionen yield return
och dess kontext. Kompilatorn utfärdar följande fel när iteratorn bryter mot någon av dessa begränsningar:
- CS1625: Kan inte ge resultat i brödtexten i en slutsats
- CS1626: Det går inte att ge ett värde i brödtexten i ett försöksblock med en catch-sats
- CS1631: Det går inte att ge ett värde i brödtexten i en catch-sats
- CS1629: Osäker kod kanske inte visas i iteratorer
- CS9238: Det går inte att använda "avkastningsretur" i ett "osäkert" block
-
CS9239: Operatorn
&
kan inte användas på parametrar eller lokala variabler i iteratormetoder.
Dessa fel indikerar att koden bryter mot säkerhetsreglerna eftersom en iterator returnerar ett element och återupptas för att generera nästa element:
- Du kan inte
yield return
från encatch
eller-satsfinally
. - Du kan inte
yield return
från etttry
block med en catch-sats. - Du kan inte
yield return
från ettunsafe
block. Kontexten för en iterator skapar ett kapslatsafe
block i det omslutandeunsafe
blocket. - Du kan inte använda operatorn
&
för att ta adressen till en variabel i en iteratormetod.
Före C# 13 kan iteratorer inte innehålla unsafe
kod (CS1629). Från och med C# 13 är den här begränsningen avslappnad. Alla yield return
instruktioner måste vara i en säker kontext, men en iteratormetod kan innehålla unsafe
kod.
Iteratormetoder har särskilda referenssäkerhetsbegränsningar. Dessa regler är avslappnade i C# 13:
- CS4013: Instans av typen kan inte användas i en kapslad funktion, frågeuttryck, iteratorblock eller asynkron metod
- CS8176: Iteratorer kan inte ha lokala efterreferenser
Före C# 13 kunde iteratorer inte deklarera ref
lokala variabler. De kunde inte deklarera några variabler av en ref struct
typ.
Från och med C# 13 ref struct
kan typer användas i iteratormetoder, om de inte används i hela yield return
instruktionen. Från och med C# 13 kan iteratormetoder deklarera ref
lokala variabler.
Feedback om .NET
.NET är ett öppen källkod projekt. Välj en länk för att ge feedback: