Partage via


Erreur du compilateur CS8177

Les méthodes asynchrones ne peuvent pas avoir de variables locales par référence

Pour gérer l’état asynchrone, les méthodes async utilisent une machine à états, en capturant l’état des variables dans les fermetures implémentées dans les classes et propriétés générées par le compilateur. Une référence de variable locale (sur la pile) ne pouvant pas être capturée dans l’instance d’une classe dans le tas, le compilateur émet une erreur.

Exemple

L’exemple suivant génère l’avertissement CS8177 avant 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);
        }
    }
}

Pour corriger cette erreur

Supprimez le modificateur ref . Vous pouvez également effectuer une mise à niveau vers C# 13, qui est fournie avec .NET 9.

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

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