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
optioneelyield break
) kan ook geen instructie gebruikenreturn
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
doorref
. 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 eencatch
offinally
component gebruikmaken. - U kunt geen
yield return
blok makentry
met een catch-component. - Je kunt niet
yield return
van eenunsafe
blok. De context voor een iterator maakt een genestesafe
blok binnen het omsluitblokunsafe
. - 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
.