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žítreturn
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 return
ref
. 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.catch
finally
- Blok s klauzulí catch nemůžete
yield return
použíttry
. -
yield return
Nemůžete zunsafe
bloku. Kontext iterátoru vytvoří vnořenýsafe
blok v rámci ohraničujícíhounsafe
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é.