不能在 ref struct 中使用 yield 关键字?

Posted

技术标签:

【中文标题】不能在 ref struct 中使用 yield 关键字?【英文标题】:Yield keyword can not be used in ref struct? 【发布时间】:2020-10-02 07:33:09 【问题描述】:

我想在 ref 结构方法中使用yield

public ref struct RefStruct 

    public IEnumerator<int> GetEnumerator()
    
        yield return 1;
    

编译器报错:

CS4013 'RefStruct' 类型的实例不能在嵌套函数、查询表达式、迭代器块或异步方法中使用

但是RefStruct的实例并没有在迭代器块中使用。

我可以假设yield 引用结构的翻译规则没有改变。与在类中一样,yield 的方法被转换为 GetEnumerator 类,该类具有存储 ref 结构实例的字段。这是不正确的,因为类字段不能是 ref struct。但是在这种情况下,编译器必须抱怨另一个错误。

这是一个错误还是我做错了什么?

【问题讨论】:

编译器决定在生成的枚举器类中创建保留this 的副本:SharpLab @conton7 你在这里缺少ref 关键字。 @imsmn 这是故意的:使用ref,您会收到编译器错误,因此看不到反编译的输出(显然)。离开ref 可以让您查看编译器为普通结构生成的内容,其中包括将结构存储在生成的迭代器类中。然后你可以推断它正在尝试对 ref 结构做同样的事情。 @canton7 啊,好的。我以为不是故意的。我的错。 The spec 试图涵盖这种情况,但我认为从技术上讲,措辞省略了它。当yield return 发生时,它禁止本地引用结构在范围内,但不认为this 也可以在范围内,并且是引用结构。如果有的话,只需要一点文档更新即可。 I raised a doc issue 【参考方案1】:

我不知道发生了什么,但是在玩了一些之后,我发现了以下解决方法,也许它很有用

public ref struct RefStruct 

    public IEnumerator<int> GetEnumerator()
    
        return Foo();

        IEnumerator<int> Foo()
        
            yield return 1;
        
    

【讨论】:

以上是关于不能在 ref struct 中使用 yield 关键字?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 ref-struct 和 ref-array 创建结构数组?

Node.js使用ffi-napi,ref-napi,ref-array-napi,ref-struct-napi调用动态库

C# 11 对 ref 和 struct 的改进

Unity随手机

Linux 内核调度器 ④ ( sched_class 调度类结构体分析 | yield_task 函数 | heck_preempt_curr 函数 | task_struct 函数 )

C# 11 对 ref 和 struct 的改进