异步方法不能有按引用的局部变量
为了管理异步状态,async
方法使用状态机,捕获在编译器生成的类和属性中实现的封闭中的变量状态。 无法在堆中的类实例中捕获(堆栈上的)局部变量引用,因此编译器会发出错误。
示例
在 C# 13 之前,下面的示例会生成 CS8177:
// 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);
}
}
}
更正此错误
删除该 ref
修饰符。 或者,可以升级到随 .NET 9 一起提供的 C# 13。
class C
{
public async static Task Test()
{
await Task.CompletedTask;
foreach (int x in new E())
{
System.Console.Write(x);
}
}
}