Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有内置的;“简化”;和罗斯林?_C#_Roslyn - Fatal编程技术网

C# 是否有内置的;“简化”;和罗斯林?

C# 是否有内置的;“简化”;和罗斯林?,c#,roslyn,C#,Roslyn,是否有任何内置方法可以使用Roslyn执行与C#编译器相同的编译时转换,例如,将迭代器、初始值设定项、lambdas、LINQ等转换为基本C#代码?AFAIK,不,Roslyn中没有公开这种东西。但是编译器必须以某种方式进行这些转换,因此您可以通过访问一些内部方法来实现这一点 当然,您可以使用Roslyn自己进行这些转换,但这不是您想要的。Roslyn编译器API的设计目的是(除了将源代码转换为IL之外)让您构建源代码分析和转换工具 但是,lambda和迭代器没有可以始终使用源代码指定的翻译。它

是否有任何内置方法可以使用Roslyn执行与C#编译器相同的编译时转换,例如,将迭代器、初始值设定项、lambdas、LINQ等转换为基本C#代码?

AFAIK,不,Roslyn中没有公开这种东西。但是编译器必须以某种方式进行这些转换,因此您可以通过访问一些
内部
方法来实现这一点


当然,您可以使用Roslyn自己进行这些转换,但这不是您想要的。

Roslyn编译器API的设计目的是(除了将源代码转换为IL之外)让您构建源代码分析和转换工具

但是,lambda和迭代器没有可以始终使用源代码指定的翻译。它们使用内部绑定节点抽象进行建模,该抽象包括只能使用IL表示的额外编译器特定规则


将LINQ翻译成C#中的源代码是可能的,因为它被指定为源代码翻译(不管编译器是否真的这样做)。然而,没有编译器API专门做到这一点。如果有,它可能会显示为服务层API,而不是编译器API。

+1该死,谢谢。似乎有相关文档(
LambdaRewriter
?)但是整个类都是内部的!它似乎也在使用类似于
BoundNode
的东西,这也是内部的:(你可以使用反射来使用
internal
东西,这不是很方便。是的,但是弄清楚如何使用它们是第一个障碍。我知道你对迭代器的看法是正确的,异常处理是以一种不能用C#表示的方式完成的,但是lambdas需要什么不能用C#表示的呢?(编辑:当然,除了使用在C#中无效的名称外,还可以使用任何名称。)是什么让迭代器在C#中无法表达?它们不只是状态正常的机器吗?@Mehrdad:John Skeet对它们在C#中的实现方式有很好的描述。特别是,我们有时会生成goto,这些goto跨越了在C#中通常不允许的东西。@JasonMalinowski:啊,我明白了,我没有意识到一些goto是非法的。:-)谢谢!