Fehler und Warnungen im Zusammenhang mit der yield return
-Anweisung und Iterator-Methoden
Es gibt zahlreiche Fehler im Zusammenhang mit der yield return
-Anweisung und Iterator-Methoden:
- CS1622: Ein Wert kann nicht von einem Iterator zurückgegeben werden. Verwenden Sie die „yield return“-Anweisung zum Zurückgeben eines Werts oder zum Beenden der Iteration.
- CS1624: Der Text von „accessor“ kann kein Iteratorblock sein, da „Typ“ kein Iteratorschnittstellentyp ist
- CS1625: „yield“ kann nicht im Text einer finally-Klausel verwendet werden
- CS1626: Mit „yield“ kann im Text eines try-Blocks mit einer catch-Klausel kein Wert zurückgegeben werden
- CS1627: Ausdruck nach „yield return“ erwartet
- CS1629: Unsicherer Code wird möglicherweise nicht in Iteratoren angezeigt
- CS1631: Mit „yield“ kann im Text einer catch-Klausel kein Wert zurückgegeben werden
- CS1637: Iteratoren dürfen keine unsicheren Parameter oder yield-Typen aufweisen
- CS4013: Eine Instanz des Typs kann nicht in einer eingeschachtelten Funktion, einem Abfrageausdruck, einem Iteratorblock oder einer Async-Methode verwendet werden
- CS8154: Der Text darf kein Iteratorblock sein, weil die Rückgabe als Verweis erfolgt
- CS8176: Iteratoren dürfen keine lokalen Verweiselemente aufweisen
- CS9238: „yield return“ kann nicht in einem „unsicheren“ Block verwendet werden
- CS9239: Der Operator
&
kann nicht für Parameter oder lokale Variablen in Iteratormethoden verwendet werden.
Struktur einer Iteratormethode
Eine Iteratormethode muss mehreren Regeln in C# entsprechen. Der Compiler gibt die folgenden Fehler aus, wenn die Iteratormethode gegen eine oder mehrere dieser Regeln verstößt:
- CS1622: Ein Wert kann nicht von einem Iterator zurückgegeben werden. Verwenden Sie die „yield return“-Anweisung zum Zurückgeben eines Werts oder zum Beenden der Iteration.
- CS1624: Der Text von 'accessor' kann kein Iteratorblock sein, da 'typ' kein Iteratorschnittstellentyp ist
- CS1627: Ausdruck nach „yield return“ erwartet
- CS1637: Iteratoren dürfen keine unsicheren Parameter oder yield-Typen aufweisen
- CS8154: Der Text darf kein Iteratorblock sein, weil die Rückgabe als Verweis erfolgt
Ihre Iteratormethode muss den folgenden Regeln entsprechen:
- Eine Iteratormethode (mit
yield return
und optionalyield break
) kann nicht auch einereturn
-Anweisung verwenden, um eine Sequenz zurückzugeben. - Eine Iteratormethode muss einen Iteratorschnittstellentyp als Rückgabetyp deklarieren. Die Iterator-Schnittstellentypen sind: IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T>.
- Eine
yield return
-Anweisung muss einen Ausdruck enthalten, der als Teil einer Sequenz zurückgegeben werden soll.yield return;
ist ungültig. - Eine Iteratormethode kann keine unsicheren Typen als Parameter verwenden, etwa Zeiger.
- Eine Iteratormethode kann keinen
yield return
unsicheren Typ aufweisen, etwa Zeiger. - Eine Iteratormethode kann nicht
yield return
vonref
durchführen. Die Rückgabe muss nach Wert erfolgen.
Einschränkungen für Iteratormethoden
Der Textkörper einer Iteratormethode muss den Einschränkungen der yield return
-Anweisung und ihres Kontexts entsprechen. Der Compiler gibt die folgenden Fehler aus, wenn Ihr Iterator gegen eine der folgenden Einschränkungen verstößt:
- CS1625: „yield“ kann nicht im Text einer finally-Klausel verwendet werden
- CS1626: Mit „yield“ kann im Text eines try-Blocks mit einer catch-Klausel kein Wert zurückgegeben werden
- CS1631: Mit „yield“ kann im Text einer catch-Klausel kein Wert zurückgegeben werden
- CS1629: Unsicherer Code wird möglicherweise nicht in Iteratoren angezeigt
- CS9238: „yield return“ kann nicht in einem „unsicheren“ Block verwendet werden
- CS9239: Der Operator
&
kann nicht für Parameter oder lokale Variablen in Iteratormethoden verwendet werden.
Diese Fehler deuten darauf hin, dass Ihr Code Sicherheitsregeln verletzt, da ein Iterator ein Element zurückgibt und fortgesetzt wird, um das nächste Element zu generieren:
- Sie können nicht
yield return
aus einercatch
- oder einerfinally
-Klausel verwenden. - Sie können nicht
yield return
aus einemtry
-Block mit einer catch-Klausel verwenden. - Sie können nicht
yield return
von einemunsafe
-Block verwenden. Der Kontext für einen Iterator erstellt einen geschachteltensafe
-Block innerhalb des einschließendenunsafe
-Blocks. - Sie können den
&
-Operator nicht verwenden, um die Adresse einer Variablen in einer Iteratormethode zu übernehmen.
Vor C# 13 können Iteratoren keinen unsafe
- Code (CS1629) enthalten. Ab C# 13 ist diese Einschränkung gelockert. Alle yield return
-Anweisungen müssen sich in einem sicheren Kontext befinden, aber eine Iteratormethode kann unsafe
Code enthalten.
Ref-Sicherheit in Iteratormethoden
Iteratormethoden weisen besondere Ref-Sicherheitseinschränkungen auf. Diese Regeln sind in C# 13 gelockert:
- CS4013: Eine Instanz des Typs kann nicht in einer eingeschachtelten Funktion, einem Abfrageausdruck, einem Iteratorblock oder einer Async-Methode verwendet werden
- CS8176: Iteratoren dürfen keine lokalen Verweiselemente aufweisen
Vor C# 13 konnten Iteratoren keine lokalen ref
-Variablen deklarieren. Sie konnten keine Variablen eines ref struct
-Typs deklarieren.
Ab C# 13 können ref struct
-Typen in Iteratormethoden verwendet werden, wenn darauf nicht über die yield return
-Anweisung hinweg zugegriffen wird. Ab C# 13 können Iteratormethoden lokale ref
-Variablen deklarieren.