Läs på engelska

Dela via


Kompilatorfel CS8177

Asynkrona metoder kan inte ha lokala efterreferenser

För att hantera asynkront tillstånd async använder metoderna en tillståndsdator och samlar in variabeltillstånd i stängningar som implementerats i kompilatorgenererade klasser och egenskaper. En lokal variabelreferens (på stacken) kan inte samlas in i instansen av en klass i heapen, så kompilatorn utfärdar ett fel.

Exempel

Följande exempel genererar CS8177 före C# 13:

C#
// 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);
        }
    }
}

Så här åtgärdar du det här felet

ref Ta bort modifieraren. Eller så kan du uppgradera till C# 13, som levereras med .NET 9.

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

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