问题描述
我很好奇为什么异步方法返回 IAsyncEnumerable
编译到状态机,状态机被定义为类而不是通常的结构。请参见以下示例:
public async IAsyncEnumerable<int> Methodone()
{
await Task.Delay(10);
yield return 0;
}
// Compiled version
[CompilerGenerated]
private sealed class <Methodone>d__0 : IAsyncEnumerable<int>,IAsyncEnumerator<int>,IAsyncdisposable,IValueTaskSource<bool>,IValueTaskSource,IAsyncStateMachine
{
// Omitted for brevity
}
public async Task<int> MethodTwo()
{
await Task.Delay(10);
return 0;
}
// Compiled version
[StructLayout(LayoutKind.Auto)]
[CompilerGenerated]
private struct <MethodTwo>d__0 : IAsyncStateMachine
{
// Omitted for brevity
}
解决方法
状态机本身实现IAsyncEnumerable<T>
,并new
设置并作为IAsyncEnumerable<T>
实例返回。如果它是一个结构类型,无论如何它都会立即被转换为接口类型。
您可以将其与为 IEnumerable<T>
生成的状态机进行比较,public IEnumerable<int> MethodThree()
{
yield return 0;
}
// Compiled version
[CompilerGenerated]
private sealed class <MethodThree>d__0 : IEnumerable<int>,IEnumerable,IEnumerator<int>,IDisposable,IEnumerator
{
// Omitted for brevity
}
[IteratorStateMachine(typeof(<MethodThree>d__0))]
public IEnumerable<int> MethodThree()
{
return new <MethodThree>d__0(-2);
}
也是一个类:
{{1}}