none
vs 2010 C#用的是不是4.0的编译器? RRS feed

  • 问题

  • 我发觉vs2010 是不是就算选的是3.5的framework,当ide编译的时候还是调4.0的编译器的?怎么居然可以用参数默认值的? public void aaa(int p1=0){} //这样的4.0语法居然也可以编译的过的?
    2010年10月25日 2:33

答案

  • 不是,这仅仅是为语法上编程提供了便利,实质还是要根据实际的net framework转化成对应的语句的,内部执行的时候。

    就像你用VS2008用2.0的类库,但是竟然可以用var等一样(3.5)的特性一样。

    2010年10月26日 2:03
    版主
  • 你好!

        这是个好问题,我详细解释一下:

        在VS2010中,即使你选择的目标Framework设置成.NET Framework 3.5,编译的时候使用的也是C#4.0的编译器,所以C# 4.0的语法是可以通过编译的。

        那么设置成.NET Framework 3.5有什么意义呢?

        是很有意义的,这样可以保证编译出的代码可以成功的在.NET Framework 3.5上运行。实际上C# 语言的新特性有两种:

        一种是“语法糖”,只是语法上提供便利而已,编译后的IL代码和过去没有本质上的不同,你使用这种新特性,即使你目标Framework设置成.NET Framework 3.5,也是可以通过编译的。

        另外一些新特性是需要新版本的.NET Framework支持的(本质上是需要新版本的CLR支持),你使用这样的新特性,如果你设置成.NET Framework 3.5,就无法通过编译了。

        综上所述,目标Framework设置,只能保证编译后的代码是否能在相应版本的Framework上成功运行,并不强制要求一定要使用相应版本的Framework的附带的编程语言的语法。


    周雪峰
    2010年10月26日 8:08
    版主

全部回复

  • 不是,这仅仅是为语法上编程提供了便利,实质还是要根据实际的net framework转化成对应的语句的,内部执行的时候。

    就像你用VS2008用2.0的类库,但是竟然可以用var等一样(3.5)的特性一样。

    2010年10月26日 2:03
    版主
  • 你好!

        这是个好问题,我详细解释一下:

        在VS2010中,即使你选择的目标Framework设置成.NET Framework 3.5,编译的时候使用的也是C#4.0的编译器,所以C# 4.0的语法是可以通过编译的。

        那么设置成.NET Framework 3.5有什么意义呢?

        是很有意义的,这样可以保证编译出的代码可以成功的在.NET Framework 3.5上运行。实际上C# 语言的新特性有两种:

        一种是“语法糖”,只是语法上提供便利而已,编译后的IL代码和过去没有本质上的不同,你使用这种新特性,即使你目标Framework设置成.NET Framework 3.5,也是可以通过编译的。

        另外一些新特性是需要新版本的.NET Framework支持的(本质上是需要新版本的CLR支持),你使用这样的新特性,如果你设置成.NET Framework 3.5,就无法通过编译了。

        综上所述,目标Framework设置,只能保证编译后的代码是否能在相应版本的Framework上成功运行,并不强制要求一定要使用相应版本的Framework的附带的编程语言的语法。


    周雪峰
    2010年10月26日 8:08
    版主