Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Erros e avisos relacionados aos métodos de
Existem inúmeros 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 de 'accessor' não pode ser um bloco iterador porque 'type' não é um tipo de interface iterador
- CS1625: Não pode ceder no corpo de uma cláusula final
- CS1626: Não é possível produzir um valor no corpo de um bloco try com uma cláusula catch
- CS1627: Expressão esperada após o retorno do rendimento
- CS1629: Código não seguro pode não aparecer em iteradores
- CS1631: Não é possível produzir um valor no corpo de uma cláusula de captura
- CS1637: Os iteradores não podem ter parâmetros ou tipos de rendimento inseguros
- CS4013: Instância do tipo não pode ser usada dentro de uma função aninhada, expressão de consulta, bloco iterador ou método assíncrono
- CS8154: O corpo não pode ser um bloco iterador porque retorna por referência
- CS8176: Os iteradores não podem ter locais por referência
- CS9238: Não é possível usar 'retorno de rendimento' 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 seu 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 de 'accessor' não pode ser um bloco iterador porque 'type' não é um tipo de interface iterador
- CS1627: Expressão esperada após o retorno do rendimento
- CS1637: Os iteradores não podem ter parâmetros ou tipos de rendimento inseguros
- CS8154: O corpo não pode ser um bloco iterador porque retorna por referência
Seu método iterador deve seguir as seguintes regras:
- Um método iterador (usando
yield returne opcionalmenteyield break) também não pode usar umareturninstrução para retornar uma sequência. - Um método iterador deve declarar um tipo de interface iterador como o tipo de retorno. Os tipos de interface iteradora são: IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T>.
- Uma
yield returninstrução deve incluir uma expressão para retornar como parte de uma sequência.yield return;não é válido. - Um método iterador não pode usar tipos não seguros como parâmetros, como ponteiros.
- Um método iterador não
yield returnpode tipo inseguro, como ponteiros. - Um método iterador não
yield returnpode porref. Você deve retornar por valor.
Restrições aos métodos iteradores
O corpo de um método iterador deve estar em conformidade com as restrições sobre a yield return instrução e seu contexto. O compilador emite os seguintes erros quando o iterador viola uma dessas restrições:
- CS1625: Não pode ceder no corpo de uma cláusula final
- CS1626: Não é possível produzir um valor no corpo de um bloco try com uma cláusula catch
- CS1631: Não é possível produzir um valor no corpo de uma cláusula de captura
- CS1629: Código não seguro pode não aparecer em iteradores
- CS9238: Não é possível usar 'retorno de rendimento' 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 retoma para gerar o próximo elemento:
- Você não
yield returnpode a partir de umacatchfinallyou cláusula. - Você não
yield returnpode a partir de umtrybloco com uma cláusula de captura. - Você não
yield returnpode a partir de umunsafebloco. O contexto para um iterador cria um bloco aninhadosafedentro do bloco de delimitaçãounsafe. - 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 unsafe código (CS1629). 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 unsafe código.
segurança ref em métodos iteradores
Os métodos iteradores têm restrições especiais de segurança de referência. Estas regras são relaxadas no C# 13:
- CS4013: Instância do tipo não pode ser usada dentro de uma função aninhada, expressão de consulta, bloco iterador 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 ref variáveis locais. Eles não podiam declarar nenhuma variável de um ref struct tipo.
A partir do C# 13, ref struct os tipos podem ser usados em métodos iteradores, se não forem acessados entre yield return instruções. A partir do C# 13, os métodos iteradores podem declarar ref variáveis locais.