Compiler Error CS8177 (Erro do Compilador CS8177)
Os métodos assíncronos não podem ter locais por referência
Para gerenciar o estado assíncrono, os métodos async
usam uma máquina de estado, capturando o estado variável em fechamentos implementados em propriedades e classes geradas pelo compilador. Uma referência de variável local (na pilha) não pode ser capturada na instância de uma classe no heap, portanto o compilador emite um erro.
Exemplo
O exemplo a seguir gera CS8177 antes do C# 13:
// CS8177.cs (20,26)
using System.Threading.Tasks;
class E
{
public class Enumerator
{
public ref int Current => throw new System.NotImplementedException();
public bool MoveNext() => throw new System.NotImplementedException();
}
public Enumerator GetEnumerator() => new Enumerator();
}
class C
{
public async static Task Test()
{
await Task.CompletedTask;
foreach (ref int x in new E())
{
System.Console.Write(x);
}
}
}
Para corrigir este erro
Remova o modificador ref
. Ou você pode atualizar para o C# 13, que acompanha o .NET 9.
class C
{
public async static Task Test()
{
await Task.CompletedTask;
foreach (int x in new E())
{
System.Console.Write(x);
}
}
}
Colaborar conosco no GitHub
A fonte deste conteúdo pode ser encontrada no GitHub, onde você também pode criar e revisar problemas e solicitações de pull. Para obter mais informações, confira o nosso guia para colaboradores.