我多次问过这个问题。我试图找到有关此内容的博客文章,甚至深入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任何东西。对我来说,这听起来更抽象。
编辑
另外,如果任何人都可以指向在编译器中指定所需预定义类型的源代码,请告诉我!
有点。
编译器具有“特殊”(在类型系统/活页夹中使用)和“众所周知”(由生成的代码引用)类型和成员的列表,这些列表在Roslyn源代码中按名称进行硬编码。但是,它只关心这些类型/成员的名称和方法/签名。您仍然可以编写自己的mscorlib(并且人们已经这样做了),只要有它们即可。
看到
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句