Erros e avisos relacionados aos métodos de yield return
instrução e iterador
Existem vários erros relacionados aos métodos de yield return
instrução e iterador:
- CS1622: não é possível retornar um valor de um iterador. Use a instrução yield return para retornar um valor ou yield break para encerrar a iteração.
- CS1624: o corpo do "acessador" não pode ser um bloco de iterador porque "type" não é um tipo de interface do iterador
- CS1625: não é possível usar a instrução yield no corpo de uma cláusula finally
- CS1626: não é possível suspender um valor no corpo de um bloco try com uma cláusula catch
- CS1627: expressão esperada após yield return
- CS1629: código não seguro pode não aparecer em iteradores
- CS1631: não é possível suspender um valor no corpo de uma cláusula catch
- CS1637: iteradores não podem ter tipos yield nem parâmetros unsafe
- CS4013: a instância do tipo não pode ser usada dentro de uma função aninhada, expressão de consulta, bloco dos iteradores ou método assíncrono
- CS8154: o corpo não pode ser um bloco de iterador porque retorna por referência
- CS8176: os iteradores não podem ter locais por referência
- CS9238: não é possível usar "yield return"em um bloco "inseguro"
- CS9239: o
&
operador não pode ser usado em parâmetros ou variáveis locais em métodos iteradores.
Estrutura de um método iterador
Um método iterador deve estar em conformidade com várias regras em C#. O compilador emite os seguintes erros quando o método iterador viola uma ou mais dessas regras:
- CS1622: não é possível retornar um valor de um iterador. Use a instrução yield return para retornar um valor ou yield break para encerrar a iteração.
- CS1624: o corpo do "acessador" não pode ser um bloco de iterador porque "type" não é um tipo de interface do iterador
- CS1627: expressão esperada após yield return
- CS1637: iteradores não podem ter tipos yield nem parâmetros unsafe
- CS8154: o corpo não pode ser um bloco de iterador porque retorna por referência
Seu método iterador deve seguir as seguintes regras:
- Um método iterador (usando
yield return
e, opcionalmenteyield break
) não pode usar tambémreturn
para retornar uma sequência. - Um método iterador deve declarar um tipo de interface do iterador como o tipo de retorno. Os tipos de interface do iterador são: IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T>.
- Uma
yield return
instrução deve incluir uma expressão a ser retornada como parte de uma sequência.yield return;
não é válido. - Um método iterador não pode usar tipos inseguros como parâmetros, como ponteiros.
- Um método iterador não
yield return
pode ser um tipo inseguro, como ponteiros. - Um método iterador não pode
yield return
porref
. Você deve retornar por valor.
Restrições em métodos de iterador
O corpo de um método iterador deve estar em conformidade com as restrições na instrução yield return
e seu contexto. O compilador emite os seguintes erros quando o iterador viola uma dessas restrições:
- CS1625: não é possível usar a instrução yield no corpo de uma cláusula finally
- CS1626: não é possível suspender um valor no corpo de um bloco try com uma cláusula catch
- CS1631: não é possível suspender um valor no corpo de uma cláusula catch
- CS1629: código não seguro pode não aparecer em iteradores
- CS9238: não é possível usar "yield return"em um bloco "inseguro"
- CS9239: o
&
operador não pode ser usado em parâmetros ou variáveis locais em métodos iteradores.
Esses erros indicam que seu código viola as regras de segurança porque um iterador retorna um elemento e continua a gerar o próximo elemento:
- Você não pode
yield return
de umacatch
ou cláusulafinally
. - Você não pode
yield return
de um blocotry
com uma cláusula catch. - Você não pode
yield return
de umunsafe
bloco. O contexto de um iterador cria um bloco aninhadosafe
dentro do bloco delimitadorunsafe
. - Você não pode usar o operador
&
para obter o endereço de uma variável em um método iterador.
Antes do C# 13, os iteradores não podiam conter código (CS1629) unsafe
. A partir do C# 13, essa restrição é relaxada. Todas as yield return
instruções devem estar em um contexto seguro, mas um método iterador pode conter código unsafe
.
segurança de referência em métodos de iterador
Os métodos iteradores têm restrições especiais de segurança de referência. Essas regras são relaxadas no C# 13:
- CS4013: a instância do tipo não pode ser usada dentro de uma função aninhada, expressão de consulta, bloco dos iteradores ou método assíncrono
- CS8176: os iteradores não podem ter locais por referência
Antes do C# 13, os iteradores não podiam declarar variáveis locais ref
. Eles não podiam declarar nenhuma variável de um tipo ref struct
.
A partir do C# 13, os tipos ref struct
poderão ser usados em métodos com iteração, se não forem acessados em toda a instrução yield return
. A partir do C# 13, os métodos iteradores podem declarar variáveis locais ref
.