次の方法で共有


コンパイラ エラー 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);
        }
    }
}