コンパイラ エラー 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);
}
}
}
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET