为什么返回 IAsyncEnumerable 的异步方法作为类而不是结构实现?

问题描述

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

解决方法

状态机本身实现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}}

Sharplab.io

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...