1

我很好奇为什么异步方法将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 
}

Sharplab.io

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 
}

Sharplab.io

4

2 回答 2

3

状态机本身实现IAsyncEnumerable<T>,并作为实例被new编译和返回。IAsyncEnumerable<T>如果它是一个结构类型,无论如何它都会被转换成接口类型立即装箱。

于 2021-02-21T00:58:37.953 回答
0

您可以将其与为 an 生成的状态机进行比较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);
}

Sharplab.io

于 2021-02-21T02:27:38.317 回答