我最近看到很多C#4.0的变化。我真的很喜欢其中的一些。另外,我还不想因为兼容性原因而转向.Net 4.0。
那么,是否有一个全新的C#4.0语言功能列表可以在.Net 3.5或更低版本上运行?
例如,默认参数是否需要.NET 4.0 CLR,还是它们是编译器功能?可以使用自动属性(C#3.0特性)并仍然以.NET 2.0为目标,因为它不需要Framework支持,但不使用LINQ表达式,因为它确实需要Framework 3.5。
请不要说“当然C#4.0在.Net 3.5中不起作用,因为它已经老了”
答案 0 :(得分:31)
4.0中的C#编译器附带了一个新的多目标功能。简短的版本是它将生成一个程序集,其中包含定义System.Object(通常是mscorlib.dll)的引用中存在的任何元数据版本。这允许您使用它来编译2.0和3.5的程序集,以及各种版本的Silverlight。引入此功能是为了支持Visual Studio 2010中的多目标。
因此,您可以使用C#4.0编译器来编译3.5程序集,并使用您想要的任何C#4功能,只要没有对4.0库的特定依赖。例如,命名参数和可选参数将正常工作,因为它们不使用任何4.0框架功能。然而,动态,但开箱即用它将不适用于3.5。
这里有一篇关于此的文章,其中涵盖了基础知识。
http://blogs.msdn.com/ed_maurer/archive/2010/03/31/multi-targeting-and-the-c-and-vb-compilers.aspx
短名单(来自Ed的帖子)是:
不起作用的东西包括动态和非pia(我们在实施它们的时间方面的两个最大支出)。前者需要框架支持,后者需要运行时支持。
答案 1 :(得分:2)
我知道协方差和逆变通过IL注释+和 - 在CLR 2.0中的类型参数中得到了一些支持。但不确定其他功能。
答案 2 :(得分:2)
这不是一个列表,也不是决定性的,但作为一个例子,我只是建立了一个新的VS2010项目,目标是.NET 3.5并成功创建了一个带有默认参数的方法,并使用命名参数调用它,两者都是C#4.0功能。
答案 3 :(得分:0)
考虑到默认参数已经是VB.NET的一个特性,C#可能只是在编译器级别实现它。然而,CLR团队本可以完全采用一种新的方式。
您应该准备好修改您的问题,以声明“C#4.0的哪些功能是适用于.NET 3.5框架的编译器更改”
答案 4 :(得分:0)
我正在考虑“旧”规范的更改... lock
更改将无法使用,因为这需要新的重载 - 但the "field-like events" change 应该< / em>工作。我将不得不检查编译器发出的内容;-p
果然:
using System;
class Program
{
public event EventHandler SomeHandler;
static void Main() { }
}
获取新式访问者;-p