Udostępnij za pośrednictwem


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 opcjonalnie yield 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ć klasy ref. 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ć klauzuli catch or finally .
  • Nie yield return można z try bloku z klauzulą catch.
  • Nie yield return można z unsafe bloku. Kontekst iteratora tworzy zagnieżdżony safe blok w otaczającym unsafe 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.