Поделиться через


Ошибки и предупреждения, связанные с методами yield return оператора и итератора

Существует множество ошибок , связанных с оператором yield return и итератором:

  • CS1622: не удается вернуть значение из итератора. Используйте оператор возвращаемого значения, чтобы вернуть значение или завершить итерацию.
  • CS1624: тело метода доступа не может быть блоком итератора, так как тип не является типом интерфейса итератора.
  • CS1625: не удается получить в тексте предложения, наконец,
  • CS1626: не удается получить значение в тексте блока try с предложением catch
  • CS1627: выражение, ожидаемое после возврата доходности
  • CS1629: небезопасный код может не отображаться в итераторах
  • CS1631: не удается получить значение в тексте предложения catch.
  • CS1637: итераторы не могут иметь небезопасные параметры или типы доходности
  • CS4013: экземпляр типа нельзя использовать внутри вложенной функции, выражения запроса, блока итератора или асинхронного метода.
  • CS8154: тело не может быть блоком итератора, так как он возвращается по ссылке
  • CS8176: итераторы не могут иметь локальные локальные параметры по ссылке
  • CS9238: не удается использовать "возвращать доходность" в блоке "небезопасный"
  • CS9239: & оператор не может использоваться для параметров или локальных переменных в методах итератора.

Структура метода итератора

Метод итератора должен соответствовать нескольким правилам в C#. Компилятор выдает следующие ошибки, когда метод итератора нарушает одно или несколько этих правил:

  • CS1622: не удается вернуть значение из итератора. Используйте оператор возвращаемого значения, чтобы вернуть значение или завершить итерацию.
  • CS1624: тело метода доступа не может быть блоком итератора, так как тип не является типом интерфейса итератора.
  • CS1627: выражение, ожидаемое после возврата доходности
  • CS1637: итераторы не могут иметь небезопасные параметры или типы доходности
  • CS8154: тело не может быть блоком итератора, так как он возвращается по ссылке

Метод итератора должен соответствовать следующим правилам:

  • Метод итератора (с помощью yield return и при необходимости yield break) не может также использовать return инструкцию для возврата последовательности.
  • Метод итератора должен объявить тип интерфейса итератора в качестве возвращаемого типа. Типы интерфейсов итератора: IEnumerable, IEnumerable<T>, IEnumeratorIEnumerator<T>.
  • Оператор yield return должен включать выражение, возвращаемое в рамках последовательности. yield return; недопустимый.
  • Метод итератора не может использовать небезопасные типы в качестве параметров, таких как указатели.
  • Метод итератора не может небезопасный yield return тип, например указатели.
  • Метод итератора не yield return может выполняться.ref Необходимо возвращать по значению.

Ограничения на методы итератора

Текст метода итератора должен соответствовать ограничениям инструкции yield return и его контекста. Компилятор выдает следующие ошибки, когда итератор нарушает одно из следующих ограничений:

  • CS1625: не удается получить в тексте предложения, наконец,
  • CS1626: не удается получить значение в тексте блока try с предложением catch
  • CS1631: не удается получить значение в тексте предложения catch.
  • CS1629: небезопасный код может не отображаться в итераторах
  • CS9238: не удается использовать "возвращать доходность" в блоке "небезопасный"
  • CS9239: & оператор не может использоваться для параметров или локальных переменных в методах итератора.

Эти ошибки указывают на то, что код нарушает правила безопасности, так как итератор возвращает элемент и возобновляет создание следующего элемента:

  • Вы не yield return можете из catch предложения или finally предложения.
  • Вы не yield return можете из блока с предложением try catch.
  • Вы не yield return можете из unsafe блока. Контекст для итератора создает вложенный safe блок в заключивом unsafe блоке.
  • Оператор нельзя использовать & для получения адреса переменной в методе итератора.

До C# 13 итераторы не могут содержать unsafe код (CS1629). Начиная с C# 13, это ограничение расслаблено. Все yield return операторы должны находиться в безопасном контексте, но метод итератора может содержать unsafe код.

безопасность ссылок в методах итератора

Методы итератора имеют специальные ограничения безопасности. Эти правила расслаблены в C# 13:

  • CS4013: экземпляр типа нельзя использовать внутри вложенной функции, выражения запроса, блока итератора или асинхронного метода.
  • CS8176: итераторы не могут иметь локальные локальные параметры по ссылке

До C# 13 итераторы не могли объявлять ref локальные переменные. Они не могли объявлять какие-либо переменные ref struct типа.

Начиная с C# 13, ref struct типы можно использовать в методах итератора, если они не доступны в инструкции yield return . Начиная с C# 13 методы итератора могут объявлять ref локальные переменные.