我自己多次问过这个问题.我试图找到一些关于这个的博客文章,甚至挖到Roslyn源代码,但没有找到任何完整的答案.
基本上,通过一些现代的C#语言特性,编译器将采用一些语法糖并将其转换为更低级的C#代码.其中一些例子是:
using()生成一个try-finally绝对处理IDisposableIEnumerable<T>with的yield return函数会将该函数转换为实现为状态机的迭代器async必须返回Task<T>(或类似)并且也将变为状态机,可以从引擎盖下的程序事件循环重新输入所以,这些都是很好的功能,但编译器总是强制执行特定类型IEnumerable<T>,Task<T>并且IDisposable.这些类型是否以某种方式融入编译器?然而,编译器以某种方式绑定到标准库并不是真的,即使mscorlib只是普通的C#代码提供了通用功能吗?
我无法想象,因为编程语言是如此抽象和一般.正如我所看到的await,只要类型具有GetAwaiter扩展方法,就有可能进行任何操作.这对我来说听起来更抽象.
编辑
另外,如果有人能指出我在编译器中指定所需预定义类型的源代码,请告诉我!
有点。
编译器具有“特殊”(在类型系统/绑定器中使用)和“众所周知”(由生成的代码引用)类型和成员的列表,这些类型和成员按名称硬编码在 Roslyn 源代码中。然而,它关心的只是这些类型/成员的名称和方法/签名;只要有它们,您仍然可以编写自己的 mscorlib(人们已经这样做了)。
看
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |