IEnumerable <T>,Task <T>和IDisposable是否在C#编译器中进行了硬编码?

布鲁诺·泽尔

我多次问过这个问题。我试图找到有关此内容的博客文章,甚至深入Roslyn源代码中,但没有找到任何完整的答案。

基本上,具有一些现代C#语言功能,编译器将使用一些语法糖并将其转换为更底层的C#代码。其中的一些示例是:

  • using()产生一个try-finally绝对处置IDisposable
  • 返回IEnumerable<T>with的yield return函数会将其转换为实现为状态机的迭代器
  • async有的功能必须返回Task<T>(或类似的功能)并且也将变成状态机,可以从内部的程序事件循环中重新输入该状态机。

所以,这些都是不错的功能,但是编译器总是强制执行的具体类型IEnumerable<T>Task<T>IDisposable这些类型是否以某种方式烘焙到编译器中?而且,即使mscorlib只是普通的C#代码提供了通用功能,编译器是否以某种方式绑定到标准库,这不是真的吗?

我无法想象,因为编程语言是如此抽象和笼统。如我所见await,只要类型具有GetAwaiter扩展方法,就有可能-ing任何东西对我来说,这听起来更抽象。

编辑

另外,如果任何人都可以指向在编译器中指定所需预定义类型的源代码,请告诉我!

ak

有点。

编译器具有“特殊”(在类型系统/活页夹中使用)和“众所周知”(由生成的代码引用)类型和成员的列表,这些列表在Roslyn源代码中按名称进行硬编码。但是,它只关心这些类型/成员的名称和方法/签名。您仍然可以编写自己的mscorlib(并且人们已经这样做了),只要有它们即可。

看到

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章