Freigeben über


Compilerfehler CS8177

Asynchrone Methoden dürfen keine lokalen by-reference-Elemente aufweisen

Zur Verwaltung des asynchronen Zustands verwenden async-Methoden einen Zustandsautomaten, der den Zustand von Variablen in Abschlüssen erfasst, die in vom Compiler generierten Klassen und Eigenschaften implementiert sind. Ein lokaler Variablenverweis (im Stapel) kann nicht innerhalb der Instanz einer Klasse im Heap erfasst werden, sodass der Compiler einen Fehler ausgibt.

Beispiel

Im folgenden Beispiel wird vor C# 13 CS8177 generiert:

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

So beheben Sie diesen Fehler

Entfernen Sie den ref -Modifizierer. Oder Sie können ein Upgrade auf C# 13 durchführen (im Lieferumfang von .NET 9 enthalten).

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

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