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