为什么即使在定位3.5时也允许某些C#4功能?

时间:2010-05-03 20:01:45

标签: visual-studio-2010 c#-4.0

我们已升级到VS 2010,但尚未升级到.NET 4.0。我们所有的项目仍然明确定位3.5。

今天,开发人员检查了如下代码:

delegate T Generator<out T>();

据我所知,“T”和“out T”是C#4.0的功能。根据我们的构建服务器,它没有安装.NET 4.0,我是对的。办理登机手续打破了建筑。但是,为什么它会在他的机器上构建呢?为什么VS只是忽略了项目的目标框架?

其他C#4.0功能(如dynamic关键字)不构建在开发人员的计算机上。

4 个答案:

答案 0 :(得分:6)

C#规范是与CLR分开开发的。这意味着如果可以将C#功能转换为早期版本的.NET的代码,则在定位早期版本的框架时仍可以使用它。

答案 1 :(得分:4)

它们是语言功能,需要C#4编译器,但不能执行.NET 4.0框架。因此,只要所有将要构建的计算机都具有C#4编译器,您就应该能够使用这些新功能,而无需为用户安装任何额外的功能。

答案 2 :(得分:1)

要避免这种情况,请使用Project + Properties,Build选项卡,向下滚动,Advanced,Language Version =“C#3.0”

答案 3 :(得分:1)

某些新语言功能不依赖于新版本的CLR。例如,如果为Linq运算符提供实现,如LinqBridge,则可以在定位.NET 2.0时使用某些C#3.0功能(扩展方法,lambda表达式,对象初始值设定项,甚至查询语法)。这些功能仅取决于编译器,而不取决于CLR(在.NET 3.5中,CLR与.NET 2.0中的相同)。

同样,协方差和逆变不依赖于.NET 4.0 CLR,它们纯粹是一种语言功能,因此当您以.NET 3.5为目标时,可以使用in / out修饰符。另一方面,动态类型取决于.NET 4.0附带的DLR(动态语言运行时),因此在定位3.5时无法使用dynamic