Delen via


Fouten en waarschuwingen met betrekking tot de yield return instructie en iteratormethoden

Er zijn talloze fouten met betrekking tot de yield return instructie en iteratormethoden:

  • CS1622: Kan geen waarde retourneren van een iterator. Gebruik de rendementsinstructie om een waarde of rendementseinde te retourneren om de iteratie te beëindigen.
  • CS1624: De hoofdtekst van 'accessor' kan geen iteratorblok zijn, omdat 'type' geen iterator-interfacetype is
  • CS1625: Kan niet opleveren in de hoofdtekst van een definitieve component
  • CS1626: Kan geen waarde opleveren in de hoofdtekst van een try-blok met een catch-component
  • CS1627: Expressie verwacht na rendement
  • CS1629: Onveilige code wordt mogelijk niet weergegeven in iterators
  • CS1631: Kan geen waarde opleveren in de hoofdtekst van een catch-component
  • CS1637: Iterators kunnen geen onveilige parameters of opbrengsttypen hebben
  • CS4013: Het exemplaar van het type kan niet worden gebruikt binnen een geneste functie, query-expressie, iteratorblok of asynchrone methode
  • CS8154: De hoofdtekst kan geen iteratorblok zijn omdat deze wordt geretourneerd met verwijzing
  • CS8176: Iterators kunnen geen referentie lokale bevolking hebben
  • CS9238: Kan rendement niet gebruiken in een 'onveilig' blok
  • CS9239: De & operator kan niet worden gebruikt voor parameters of lokale variabelen in iteratormethoden.

Structuur van een iteratormethode

Een iterator-methode moet voldoen aan verschillende regels in C#. De compiler geeft de volgende fouten op wanneer uw iterator-methode een of meer van deze regels schendt:

  • CS1622: Kan geen waarde retourneren van een iterator. Gebruik de rendementsinstructie om een waarde of rendementseinde te retourneren om de iteratie te beëindigen.
  • CS1624: De hoofdtekst van 'accessor' kan geen iteratorblok zijn, omdat 'type' geen iterator-interfacetype is
  • CS1627: Expressie verwacht na rendement
  • CS1637: Iterators kunnen geen onveilige parameters of opbrengsttypen hebben
  • CS8154: De hoofdtekst kan geen iteratorblok zijn omdat deze wordt geretourneerd met verwijzing

Uw iterator-methode moet de volgende regels volgen:

  • Een iteratormethode (met en yield return optioneel yield break) kan ook geen instructie gebruiken return om een reeks te retourneren.
  • Een iterator-methode moet een iterator-interfacetype declareren als het retourtype. De iterator-interfacetypen zijn: IEnumerable, IEnumerable<T>, IEnumerator, . IEnumerator<T>
  • Een yield return instructie moet een expressie bevatten die moet worden geretourneerd als onderdeel van een reeks. yield return; is niet geldig.
  • Een iterator-methode kan geen onveilige typen gebruiken als parameters, zoals aanwijzers.
  • Een iteratormethode kan geen yield return onveilig type zijn, zoals aanwijzers.
  • Een iteratormethode kan niet yield return door ref. U moet retourneren op waarde.

Beperkingen voor iterator-methoden

De hoofdtekst van een iteratormethode moet voldoen aan beperkingen voor de instructie en de yield return bijbehorende context. De compiler geeft de volgende fouten op wanneer uw iterator een van deze beperkingen schendt:

  • CS1625: Kan niet opleveren in de hoofdtekst van een definitieve component
  • CS1626: Kan geen waarde opleveren in de hoofdtekst van een try-blok met een catch-component
  • CS1631: Kan geen waarde opleveren in de hoofdtekst van een catch-component
  • CS1629: Onveilige code wordt mogelijk niet weergegeven in iterators
  • CS9238: Kan rendement niet gebruiken in een 'onveilig' blok
  • CS9239: De & operator kan niet worden gebruikt voor parameters of lokale variabelen in iteratormethoden.

Deze fouten geven aan dat uw code in strijd is met de veiligheidsregels, omdat een iterator een element retourneert en hervat om het volgende element te genereren:

  • U kunt niet yield return van een catch of finally component gebruikmaken.
  • U kunt geen yield return blok maken try met een catch-component.
  • Je kunt niet yield return van een unsafe blok. De context voor een iterator maakt een geneste safe blok binnen het omsluitblok unsafe .
  • U kunt de & operator niet gebruiken om het adres van een variabele in een iterator-methode op te nemen.

Voor C# 13 kunnen iterators geen code bevatten unsafe (CS1629). Vanaf C# 13 is deze beperking versoepeld. Alle yield return instructies moeten zich in een veilige context bevinden, maar een iteratormethode kan code bevatten unsafe .

ref veiligheid in iteratormethoden

Iterator-methoden hebben speciale verw-veiligheidsbeperkingen. Deze regels zijn versoepeld in C# 13:

  • CS4013: Het exemplaar van het type kan niet worden gebruikt binnen een geneste functie, query-expressie, iteratorblok of asynchrone methode
  • CS8176: Iterators kunnen geen referentie lokale bevolking hebben

Vóór C# 13 konden iterators geen lokale variabelen declareren ref . Ze konden geen variabelen van een ref struct type declareren.

Vanaf C# 13 ref struct kunnen typen worden gebruikt in iteratormethoden als ze niet worden geopend in een instructie yield return . Vanaf C# 13 kunnen iterator-methoden lokale variabelen declareren ref .