Compartilhar via


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);
        }
    }
}