Udostępnij za pośrednictwem


Błąd kompilatora CS8177

Metody asynchroniczne nie mogą mieć lokalnych odwołań

Aby zarządzać stanem asynchronicznym, async metody używają maszyny stanu, przechwytując stan zmiennej w zamknięciach zaimplementowanych w klasach i właściwościach generowanych przez kompilator. Nie można przechwycić odwołania do zmiennej lokalnej (na stosie) w wystąpieniu klasy w stercie, więc kompilator zgłasza błąd.

Przykład

Poniższy przykład generuje CS8177 przed 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);
        }
    }
}

Aby poprawić ten błąd

ref Usuń modyfikator. Możesz też przeprowadzić uaktualnienie do wersji C# 13 dostarczanej z platformą .NET 9.

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

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