Erros e avisos relacionados aos métodos de yield return instrução e iterador

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 return e opcionalmente yield break) também não pode usar uma return instruçã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 return instruçã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 return pode tipo inseguro, como ponteiros.
  • Um método iterador não yield return pode por ref. 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 return pode a partir de uma catchfinally ou cláusula.
  • Você não yield return pode a partir de um try bloco com uma cláusula de captura.
  • Você não yield return pode a partir de um unsafe bloco. O contexto para um iterador cria um bloco aninhado safe dentro do bloco de delimitação unsafe .
  • 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.