Compartir a través de


Error del compilador CS8177

Los métodos asincrónicos no pueden tener variables locales por referencia

Para administrar ese estado asincrónico, los métodos async usan una máquina de estados, que captura el estado de las variables en clausuras implementadas en clases y propiedades generadas por el compilador. Una referencia de variable local (en la pila) no se puede capturar dentro de la instancia de una clase del montón, por lo que el compilador genera un error.

Ejemplo

El siguiente ejemplo genera el error CS8177 en versiones anteriores a 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 corregir este error

Quite el modificador ref . O bien, puede actualizar a C# 13, que se incluye con .NET 9.

class C
{
    public async static Task Test()
    {
        await Task.CompletedTask;

        foreach (int x in new E())
        {
            System.Console.Write(x);
        }
    }
}