.Net 2.0上的C#3.0兼容性
请看这里:
Using C# 3.0 (.Net 3.5) syntax in a .Net 2.0 application
对于一个完整的运行,你可以针对.NET 2.0框架和使用C#3.0的时候,不能做什么了。
总结:
- 您无法使用新的3.5组件(将System.Data.Linq,System.Xml.Linq的,System.Core程序)。
- 您不能使用Linq/Query Extensions或Extension Methods(但是,请参阅下面的方法来启用使用Linq /查询语法和扩展方法!)。
- 您可以使用Var keyword,Lambda statements,Object Initializers,Anonymous Types & Auto-Implemented Properties。
扩展方法排序的工作,但是,他们需要“System.Runtime.CompilerServices.ExtensionAttribute”为了工作,这类型的System.Core程序DLL中发现(这是不是严格一部分.NET 2.0框架)。
查询语法不能用于开箱即用,但是,如果使用第三方DLL(如LINQBridge),则可以使用查询语法。这个DLL有效地重新实现了许多你需要在面向.NET 2.0框架时执行LINQ的“缺失”类型。它还实现了Extension方法工作所需的“ExtensionAttribute”类型,所以只需从项目中添加/引用LINQBridge DLL就可以启用LINQ,查询语法/表达式和扩展方法!
我有一个article on this very topic。
简言之:
支持:
- 自动实现的属性,隐式类型的局部变量和数组,对象和集合初始化,匿名类型,部分的方法,转化成委托类型lambda表达式。
部分支持:
- 扩展方法(需要一个属性)和查询表达式(需要像LINQBridge是有用的)
不支持:
- Lambda表达式转换成表达树
实际上,我听说转换成表达式树是可以借助Mono的System.Core
实现。尽管我还没有尝试过......我保持这样做的意义(然后更新页面)。
是的,我怀疑只要有合适的Expression类,表达式树的东西就可以正常工作。当然,这个类的确切需求没有在规范中记录,如果* anything *错了,编译器会以非常混乱的方式爆发(比你期望的要糟糕得多)。我尝试了一小部分乐趣很有趣(http://marcgravell.blogspot.com/2009/04/re-implementing-expression-for-compact.html) - 单声道选项对于完整版本更有意义。 – 2009-09-10 10:51:34
+1,感谢乔恩和马克:) – 2009-09-10 12:04:50
乔恩击败了我。在命运的一个奇怪的转折中,我已经链接到的博客文章的第一条评论是来自Jon Skeet(!) – CraigTP 2009-09-10 10:48:49
重复第二个“你不能” - 你可以使用查询语法 - 只是他们不是“除非你使用LINQBridge之类的东西。 – 2009-09-10 10:52:50
@Marc - 你是对的。感谢您指出了这一点。我编辑了我的答案以反映这一事实。 – CraigTP 2009-09-10 11:09:25