Compartilhar via


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, opcionalmente yield break) não pode usar também return 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 por ref. 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 uma catch ou cláusula finally.
  • Você não pode yield return de um bloco try com uma cláusula catch.
  • Você não pode yield return de um unsafe bloco. O contexto de um iterador cria um bloco aninhado safe dentro do bloco delimitador 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 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.