Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ошибки и предупреждения, связанные с методами
Существует множество ошибок , связанных с оператором 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можете из блока с предложениемtrycatch. - Вы не
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 локальные переменные.