Läs på engelska

Dela via


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.

Struktur för en iteratormetod

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 eventuellt yield break) kan inte också använda en return -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 med ref. Du måste returnera med värde.

Begränsningar för iteratormetoder

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 en catch eller-sats finally .
  • Du kan inte yield return från ett try block med en catch-sats.
  • Du kan inte yield return från ett unsafe block. Kontexten för en iterator skapar ett kapslat safe block i det omslutande unsafe 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.

referenssäkerhet i iteratormetoder

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.