Sdílet prostřednictvím


Chyby a upozornění související s yield return metodami příkazu a iterátoru

K příkazům a metodám iterátoru dochází k mnoha yield return:

  • CS1622: Nelze vrátit hodnotu z iterátoru. Příkaz yield return slouží k vrácení hodnoty nebo konce výnosu k ukončení iterace.
  • CS1624: Tělo "příslušenství" nemůže být blok iterátoru, protože typ není typem rozhraní iterátoru.
  • CS1625: Nelze získat v textu klauzule finally
  • CS1626: Nelze poskytnout hodnotu v textu bloku try s klauzulí catch
  • CS1627: Výraz očekávaný po vrácení výnosu
  • CS1629: Nebezpečný kód se nemusí objevit v iterátorech
  • CS1631: Nelze získat hodnotu v textu klauzule catch.
  • CS1637: Iterátory nemohou mít nebezpečné parametry nebo typy výnosu
  • CS4013: Instanci typu nelze použít uvnitř vnořené funkce, výrazu dotazu, bloku iterátoru nebo asynchronní metody
  • CS8154: Text nemůže být blok iterátoru, protože vrací odkazem
  • CS8176: Iterátory nemohou mít místní hodnoty podle odkazu
  • CS9238: Nelze použít výnos v nebezpečném bloku
  • CS9239: Operátor & nelze použít u parametrů nebo místních proměnných v metodách iterátoru.

Struktura metody iterátoru

Metoda iterátoru musí odpovídat několika pravidlům v jazyce C#. Kompilátor vydá následující chyby, když vaše metoda iterátoru porušuje jedno nebo více těchto pravidel:

  • CS1622: Nelze vrátit hodnotu z iterátoru. Příkaz yield return slouží k vrácení hodnoty nebo konce výnosu k ukončení iterace.
  • CS1624: Tělo "příslušenství" nemůže být blok iterátoru, protože typ není typem rozhraní iterátoru.
  • CS1627: Výraz očekávaný po vrácení výnosu
  • CS1637: Iterátory nemohou mít nebezpečné parametry nebo typy výnosu
  • CS8154: Text nemůže být blok iterátoru, protože vrací odkazem

Vaše metoda iterátoru musí dodržovat následující pravidla:

  • Metoda iterátoru (pomocí yield return a volitelně yield break) nemůže také použít return příkaz k vrácení sekvence.
  • Metoda iterátoru musí deklarovat typ rozhraní iterátoru jako návratový typ. Typy rozhraní iterátoru IEnumerator<T>
  • Příkaz yield return musí obsahovat výraz, který se má vrátit jako součást sekvence. yield return; není platný.
  • Metoda iterátoru nemůže používat nebezpečné typy jako parametry, jako jsou ukazatele.
  • Metoda iterátoru nemůže yield return nebezpečný typ, například ukazatele.
  • Metoda iterátoru nemůže yield returnref. Je nutné vrátit hodnotu.

Omezení metod iterátoru

Tělo metody iterátoru musí odpovídat omezením příkazu yield return a jeho kontextu. Kompilátor vydá následující chyby, když iterátor porušuje jedno z těchto omezení:

  • CS1625: Nelze získat v textu klauzule finally
  • CS1626: Nelze poskytnout hodnotu v textu bloku try s klauzulí catch
  • CS1631: Nelze získat hodnotu v textu klauzule catch.
  • CS1629: Nebezpečný kód se nemusí objevit v iterátorech
  • CS9238: Nelze použít výnos v nebezpečném bloku
  • CS9239: Operátor & nelze použít u parametrů nebo místních proměnných v metodách iterátoru.

Tyto chyby značí, že váš kód porušuje bezpečnostní pravidla, protože iterátor vrátí prvek a obnoví, aby vygeneroval další prvek:

  • Z klauzule nebo yield return klauzule nemůžete.catchfinally
  • Blok s klauzulí catch nemůžete yield return použít try .
  • yield return Nemůžete z unsafe bloku. Kontext iterátoru vytvoří vnořený safe blok v rámci ohraničujícího unsafe bloku.
  • Operátor nelze použít & k převzetí adresy proměnné v metodě iterátoru.

Před C# 13 nemůžou iterátory obsahovat unsafe kód (CS1629). Počínaje C# 13 je toto omezení uvolněné. Všechny yield return příkazy musí být v bezpečném kontextu, ale metoda iterátoru může obsahovat unsafe kód.

bezpečnost ref v metodách iterátoru

Metody iterátoru mají zvláštní omezení bezpečnosti ref. V jazyce C# 13 jsou tato pravidla uvolněná:

  • CS4013: Instanci typu nelze použít uvnitř vnořené funkce, výrazu dotazu, bloku iterátoru nebo asynchronní metody
  • CS8176: Iterátory nemohou mít místní hodnoty podle odkazu

Před C# 13 nemohly iterátory deklarovat ref místní proměnné. Nemohly deklarovat žádné proměnné ref struct typu.

Počínaje jazykem C# 13 ref struct je možné použít typy v metodách iterátoru, pokud nejsou přístupné napříč příkazy yield return . Počínaje jazykem C# 13 mohou metody iterátoru deklarovat ref místní proměnné.