在.Net 2.0上实现C# 3.0兼容性

4

我们可以在针对.Net 2.0框架的应用程序中使用哪些C# 3.0语言特性?

PS:我知道一些,比如Lambda表达式和var关键字。

2个回答

5

我有一篇关于这个话题的文章

简而言之:

支持:

  • 自动实现属性,隐式类型的局部变量和数组,对象和集合初始化程序,匿名类型,部分类方法,转换为委托类型的Lambda表达式。

部分支持:

  • 扩展方法(需要一个属性)和查询表达式(需要类似LINQBridge的东西才能发挥作用)

不支持:

  • 转换为表达式树的Lambda表达式

实际上,我听说借助Mono的System.Core实现,转换为表达式树是可用的。虽然我还没有尝试过...我一直想这么做(然后更新页面)。


1
是的,我怀疑表达式树的东西应该可以正常工作,只要有一个合适的Expression类。当然,该类的确切要求在规范中没有记录,如果任何地方出错,编译器会以一种非常混乱的方式爆炸(比您预期的要丑陋得多)。我很享受尝试其中的一小部分(http://marcgravell.blogspot.com/2009/04/re-implementing-expression-for-compact.html) - 对于完整版本来说,选择mono选项更有意义。 - Marc Gravell

4
请看这里:

在.NET 2.0应用程序中使用C#3.0(.Net 3.5)语法

了解在针对.NET 2.0框架并使用C#3.0时可以做什么和不能做什么的完整运行过程。

总结:

扩展方法有点可行,但是需要“System.Runtime.CompilerServices.ExtensionAttribute”才能工作,并且此类型在System.Core DLL中找到(严格来说不属于.NET 2.0框架)。

Query Syntax不能直接使用,但是如果使用第三方DLL(例如LINQBridge),则可以使用。该DLL有效地重新实现了许多您在针对.NET 2.0框架时执行LINQ所需的“缺少”的类型。它还实现了“ExtensionAttribute”类型,以便Extension Methods可以工作,因此只需将LINQBridge DLL添加/引用到您的项目中即可启用LINQ,Query Syntax /表达式和Extension Methods!


Jon比我更快完成了它。在一种奇怪的命运转折中,我链接的博客文章的第一条评论来自Jon Skeet(!) - CraigTP
1
关于第二个“你不能”的问题 - 你可以使用查询语法 - 只是它们不会出现,除非你使用类似 LINQBridge 的工具。 - Marc Gravell
@Marc - 你说得对。感谢指出这一点。我已经编辑了我的答案以反映这个事实。 - CraigTP
这些事实非常有趣... 我会接受你的答案,因为Jon获得了很多声誉 :P - Prashant Cholachagudda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接