在为较旧的.NET Framework版本构建时,使用较新的C#功能安全吗?

在为较旧的.NET Framework版本构建时,使用较新的C#功能安全吗?,c#,.net,visual-studio,C#,.net,Visual Studio,我维护一个.NET 2.0库(目前使用Visual Studio 2013) 我在库的代码上使用了一个代码检查工具,当该工具建议使用?操作符或lambdas而不是一些代码时,我感到惊讶 我更惊讶的是,我应用了建议的编辑,并且在那之后成功地构建了库 为什么将targetframework设置为.netframework2.0的库可以在其代码中使用较新的C#特性构建 在为较旧的.NET Framework版本构建时,使用较新的C#功能安全吗?我的意思是,该库的用户只能使用.NET Framework

我维护一个.NET 2.0库(目前使用Visual Studio 2013)

我在库的代码上使用了一个代码检查工具,当该工具建议使用
操作符或lambdas而不是一些代码时,我感到惊讶

我更惊讶的是,我应用了建议的编辑,并且在那之后成功地构建了库

为什么将
targetframework
设置为
.netframework2.0
的库可以在其代码中使用较新的C#特性构建

在为较旧的.NET Framework版本构建时,使用较新的C#功能安全吗?我的意思是,该库的用户只能使用.NET Framework 2.0,我希望他们能够使用该库,即使我在其代码中使用了lambdas。

.NET 2.0和C#2.0是两种不同的东西。在您的例子中,您完全可以拥有一个.NET2.0库(目标是CLR2.0),并使用支持例如lambda表达式的C#3.0编译器

因此,您应该在编译器版本和目标CLR版本之间进行区分。由于您使用的是VS 2013,因此可以使用较新版本的编译器

在为较旧的.NET Framework版本构建时,使用较新的C#功能安全吗

是的,非常安全。生成的程序集仍以CLR 2.0为目标,并且在使用此旧版本的CLR时不会出现任何问题。

基本上,新的C语言功能可以在编译器中实现,而无需对底层.net framework进行扩展。事情并非总是这样,但也可能是这样

就lambdas而言,它们是在C#3.0中引入的。因此,您需要一个该级别或更高级别的编译器。然而,C#3.0中引入的新功能都是使用.NET2.0的功能构建的。因此,您可以在.NET2.0下使用lambdas

本质上,这里的新功能是在编译器中实现的,而不是在框架中实现的


至于空合并操作符,
,它是在C#2.0中引入的,因此能够在.NET2.0下使用它也就不足为奇了

雷拉姆达斯:看一看。只要确保团队中的其他人都在使用VS>=2010
是C#2特性。lambda是一种编译器功能,因此您可以在针对.Net 2时使用它们,但在.Net 3.5中定义的委托类型(
Action
Func
等)将不可用。在9年前的免费库版本上卡住是非常没有效率的。你的工具供应商当然没有这个问题:)@HansPassant是的,我很乐意从2.0升级到4.0(至少如此),但是这个库是由使用旧版本开发工具的人使用的,我可以把他们留下。也许这是鸡和蛋问题的另一个版本。我还要补充一点,您甚至可以在针对.NET 2.0的时候使用LINQ,只需使用一句话,但问题没有提到可空类型(
“操作符”),只提到了coalesce(
)操作符,它也是在.NET 2.0中引入的。