Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Chyby a upozornění související s
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 returna volitelněyield break) nemůže také použítreturnpří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 returnmusí 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 returnnebezpeč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 returnklauzule nemůžete.catchfinally - Blok s klauzulí catch nemůžete
yield returnpoužíttry. -
yield returnNemůžete zunsafebloku. Kontext iterátoru vytvoří vnořenýsafeblok v rámci ohraničujícíhounsafebloku. - 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é.