编译器错误 CS8177

异步方法不能有按引用的局部变量

为了管理异步状态,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);
        }
    }
}