Błąd kompilatora CS8177
Metody asynchroniczne nie mogą mieć lokalnych odwołań
Aby zarządzać stanem asynchronicznym, async
metody używają maszyny stanu, przechwytując stan zmiennej w zamknięciach zaimplementowanych w klasach i właściwościach generowanych przez kompilator. Nie można przechwycić odwołania do zmiennej lokalnej (na stosie) w wystąpieniu klasy w stercie, więc kompilator zgłasza błąd.
Przykład
Poniższy przykład generuje CS8177 przed 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);
}
}
}
Aby poprawić ten błąd
ref
Usuń modyfikator. Możesz też przeprowadzić uaktualnienie do wersji C# 13 dostarczanej z platformą .NET 9.
class C
{
public async static Task Test()
{
await Task.CompletedTask;
foreach (int x in new E())
{
System.Console.Write(x);
}
}
}
Współpracuj z nami w serwisie GitHub
Źródło tej zawartości można znaleźć w witrynie GitHub, gdzie można również tworzyć i przeglądać problemy i żądania ściągnięcia. Więcej informacji znajdziesz w naszym przewodniku dla współtwórców.