Błędy i ostrzeżenia związane z instrukcją yield return
i metodami iteratora
Istnieje wiele błędów związanych z instrukcją yield return
i metodami iteratora:
- CS1622: Nie można zwrócić wartości z iteratora. Użyj instrukcji zwrotu wydajności, aby zwrócić wartość lub podział wydajności, aby zakończyć iterację.
- CS1624: Treść "akcesorium" nie może być blokiem iteratora, ponieważ typ nie jest typem interfejsu iteratora
- CS1625: Nie można uzyskać w treści klauzuli finally
- CS1626: Nie można uzyskać wartości w treści bloku try z klauzulą catch
- CS1627: Wyrażenie oczekiwane po powrocie wydajności
- CS1629: Niebezpieczny kod może nie pojawiać się w iteratorach
- CS1631: Nie można uzyskać wartości w treści klauzuli catch
- CS1637: Iteratory nie mogą mieć niebezpiecznych parametrów ani typów wydajności
- CS4013: Wystąpienie typu nie może być używane wewnątrz zagnieżdżonej funkcji, wyrażenia zapytania, bloku iteratora lub metody asynchronicznej
- CS8154: Treść nie może być blokiem iteratora, ponieważ zwraca odwołanie
- CS8176: Iteratory nie mogą mieć lokalnych odwołań
- CS9238: Nie można użyć "zwrotu wydajności" w bloku "niebezpieczny"
-
CS9239:
&
Operator nie może być używany na parametrach ani zmiennych lokalnych w metodach iteratora.
Struktura metody iteratora
Metoda iteratora musi być zgodna z kilkoma regułami w języku C#. Kompilator wystawia następujące błędy, gdy metoda iteratora narusza co najmniej jedną z tych reguł:
- CS1622: Nie można zwrócić wartości z iteratora. Użyj instrukcji zwrotu wydajności, aby zwrócić wartość lub podział wydajności, aby zakończyć iterację.
- CS1624: Treść "akcesorium" nie może być blokiem iteratora, ponieważ typ nie jest typem interfejsu iteratora
- CS1627: Wyrażenie oczekiwane po powrocie wydajności
- CS1637: Iteratory nie mogą mieć niebezpiecznych parametrów ani typów wydajności
- CS8154: Treść nie może być blokiem iteratora, ponieważ zwraca odwołanie
Metoda iteratora musi być zgodna z następującymi regułami:
- Metoda iteratora (przy użyciu
yield return
i opcjonalnieyield break
) nie może również użyćreturn
instrukcji w celu zwrócenia sekwencji. - Metoda iteratora musi zadeklarować typ interfejsu iteratora jako typ zwracany. Typy interfejsów iteratora to: IEnumerable, , IEnumerable<T>IEnumerator, IEnumerator<T>.
- Instrukcja
yield return
musi zawierać wyrażenie, które ma zostać zwrócone w ramach sekwencji.yield return;
jest nieprawidłowy. - Metoda iteratora nie może używać niebezpiecznych typów jako parametrów, takich jak wskaźniki.
- Metoda iteratora nie
yield return
może niebezpiecznego typu, takiego jak wskaźniki. - Metoda iteratora nie
yield return
może mieć klasyref
. Musisz zwrócić wartość.
Ograniczenia dotyczące metod iteratora
Treść metody iteratora musi być zgodna z ograniczeniami instrukcji yield return
i jej kontekstu. Kompilator wystawia następujące błędy, gdy iterator narusza jedno z następujących ograniczeń:
- CS1625: Nie można uzyskać w treści klauzuli finally
- CS1626: Nie można uzyskać wartości w treści bloku try z klauzulą catch
- CS1631: Nie można uzyskać wartości w treści klauzuli catch
- CS1629: Niebezpieczny kod może nie pojawiać się w iteratorach
- CS9238: Nie można użyć "zwrotu wydajności" w bloku "niebezpieczny"
-
CS9239:
&
Operator nie może być używany na parametrach ani zmiennych lokalnych w metodach iteratora.
Te błędy wskazują, że kod narusza reguły bezpieczeństwa, ponieważ iterator zwraca element i wznawia generowanie następnego elementu:
- Nie
yield return
można utworzyć klauzulicatch
orfinally
. - Nie
yield return
można ztry
bloku z klauzulą catch. - Nie
yield return
można zunsafe
bloku. Kontekst iteratora tworzy zagnieżdżonysafe
blok w otaczającymunsafe
bloku. - Nie można użyć
&
operatora , aby pobrać adres zmiennej w metodzie iteratora.
Przed c# 13 iteratory nie mogą zawierać unsafe
kodu (CS1629). Począwszy od języka C# 13, to ograniczenie jest złagodzone. Wszystkie yield return
instrukcje muszą być w bezpiecznym kontekście, ale metoda iteratora może zawierać unsafe
kod.
ref safety in iterator methods (bezpieczeństwo ref w metodach iteratora)
Metody iteracyjne mają specjalne ograniczenia bezpieczeństwa ref. Te reguły są złagodzone w języku C# 13:
- CS4013: Wystąpienie typu nie może być używane wewnątrz zagnieżdżonej funkcji, wyrażenia zapytania, bloku iteratora lub metody asynchronicznej
- CS8176: Iteratory nie mogą mieć lokalnych odwołań
Przed 13. rokiem iteratory nie mogą zadeklarować ref
zmiennych lokalnych. Nie mogą zadeklarować żadnych zmiennych ref struct
typu.
Począwszy od języka C# 13, ref struct
typy mogą być używane w metodach iteratora, jeśli nie są one dostępne w całej yield return
instrukcji. Począwszy od języka C# 13, metody iteracyjne mogą deklarować ref
zmienne lokalne.