yield
运算符由编译器实现,生成一个实现遵守IEnumerable
和IEnumerator
的状态机的类。
给定Roslyn MethodDeclarationSyntax
,可以创建ClassDeclarationSyntax
并生成MoveNext
方法,正如编译器通常所做的那样。如果编写一个支持yield
运算符的交叉编译器,则必须进行此转换 - 首先要重写C#代码以不使用yield运算符,然后让交叉编译器从那里获取它
然而,很明显,由于Roslyn可以端到端地编译C#代码,因此它必须具有以某种方式执行此转换的逻辑,并且自己实现此算法非常重要。
我的问题:这种逻辑是否以这样的方式暴露,即可以利用它将给定的MethodDeclarationSyntax
转换为相应的ClassDeclarationSyntax
迭代器声明?或者它是否在Emit
阶段消失,因此在SyntaxNode
之间工作时无法使用?
答案 0 :(得分:4)
当前的Roslyn位处理迭代器方法,作为代码生成阶段的一部分。不幸的是,这个阶段主要是不透明的,并且使用了一个未公开API的内部表示。 Roslyn.Compilers.CSharp.IteratorRewriter
内部类是实现它的地方,如果你想深入研究它。
目前,您必须自己实施。然而,Roslyn团队已经暗示将对公众CTP进行近期更新,并进行大量的API更改,因此您可以交叉使用,也许下一个版本将具有此功能。