Freigeben über


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 optional yield break) kann nicht auch eine return-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 von ref 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 einer catch- oder einer finally-Klausel verwenden.
  • Sie können nicht yield return aus einem try-Block mit einer catch-Klausel verwenden.
  • Sie können nicht yield return von einem unsafe-Block verwenden. Der Kontext für einen Iterator erstellt einen geschachtelten safe-Block innerhalb des einschließenden unsafe-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.