阅读《C#高级编程》系列丛书中,介绍C#与.NET的关系,提到C#是语言,.NET是平台(C#不是.NET的一部分),说”.NET支持的一些特性,C#并不支持“,这个可以理解,因为C#只是.NET平台支持的语言中的一种,并且.NET可以直接编写IL程序;但是又说”C#支持的一些特性,.NET并不支持“,这我就不理解,因为C#只能在.NET平台上运行,那C#支持的特性,.NET上不支持,程序是怎么运行的呢?求解!
大家的答案都倾向于”C#支持的一些特性,.NET并不支持“,编译后的事情。那这么理解会不会更好:.NET核心是CLR,CLR操作的是IL,.NET支持的特性就是IL的特性,IL是.NET平台所有语言的最小功能集,所以.NET并不支持C#所有特性,命题成立。
C#支持的特性,.NET上不支持,程序是怎么运行的呢?这个问题大家没证明出来呀?eg:运算符重载
猜测:C#不被.NET支持的特性能够在.NET运行,我怀疑或许可以归功于C#编译器,有可能是它把C#不被支持的特性拆分成几部分.NET支持的特性,那么C#不被支持的特性就可以运行了。
你要分清楚语言、编译器和CLR的关系。
语言特性比如扩展方法,这东西时纯粹的属于编译器支持的特性,而CLR并不支持。CLR不支持的这部分都是属于编译器特性,俗称语法糖。
但是CLR支持的仅返回类型不同其他都相同的方法重载,而C#并不支持。CLR支持的这部分属于IL的能力范围,但是C#并没有实现IL所支持的所有特性。
嗯嗯,很清晰,编译器和语法糖两个关键点清楚的说明了问题。
语言的处理器,包括编译器,静态分析器等,经常会在处理之前把语法糖构件转换成更加基础的构件,这个过程通常被称为"desugaring"。
谢谢!
"这我就不理解,因为C#只能在.NET平台上运行"
后半句不对
C#目前运行环境是只有.NET平台的呀?
@junlu: mono,.net core甚至其他脚本
@花飘水流兮: 嗯嗯,是我不对
c#编译后生成.net运行时,编译后与c#没有关系了,可以反编译c#或者VB.net等
编译后的结果,C#的特性(运算符重载)转化成.NET所支持的东西,但是使用IL直接操作.NET是不能实现C#的特性(运算符重载),这么理解对吧?
.net家族下所有语言,只要都遵循CLI规则,最后在CLR层面运行都是一样的。运行时不是看语言了而是看虚拟机,编译后不管你是c#还是f#都一样。