Errore del compilatore CS8177
I metodi Async non possono includere variabili locali per riferimento
Per gestire lo stato asincrono, i metodi async
usano una macchina a stati, acquisendo lo stato delle variabili nelle chiusure implementate nelle classi e nelle proprietà generate dal compilatore. Non è possibile acquisire un riferimento a una variabile locale (nello stack) all'interno dell'istanza di una classe nell'heap, pertanto il compilatore genera un errore.
Esempio
L'esempio seguente genera l'errore CS8177 prima di 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);
}
}
}
Per correggere l'errore
Rimuovere il modificatore ref
. In alternativa, è possibile eseguire l'aggiornamento a C# 13, fornito con .NET 9.
class C
{
public async static Task Test()
{
await Task.CompletedTask;
foreach (int x in new E())
{
System.Console.Write(x);
}
}
}