【问题标题】:C# 3.0 compatibility on .Net 2.0.Net 2.0 上的 C# 3.0 兼容性
【发布时间】:2009-09-10 10:29:58
【问题描述】:

我们可以在面向 .Net 2.0 框架的应用程序中使用哪些 C# 3.0 语言功能?

PS:我知道很少有人喜欢 Lambda 表达式和 var 关键字

【问题讨论】:

    标签: c# .net-3.5 .net-2.0 compatibility


    【解决方案1】:

    我有一个article on this very topic

    简而言之:

    支持:

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

    部分支持:

    • 扩展方法(需要一个属性)和查询表达式(需要 LINQBridge 之类的东西才有用)

    不支持:

    • Lambda 转换为表达式树

    事实上,我听说可以借助 Mono 的 System.Core 实现转换成表达式树。不过我还没有尝试过……我一直想这样做(然后更新页面)。

    【讨论】:

    • 是的,我怀疑表达式树的东西可以正常工作,只要有合适的 Expression 类。当然,该类的确切要求并没有记录在规范中,如果 anything 是错误的,编译器会以 very 混乱的方式爆炸(比您预期的要丑陋得多) )。我只尝试了其中的一小部分(marcgravell.blogspot.com/2009/04/…)就很开心——单声道选项对于完整版来说更有意义。
    【解决方案2】:

    请看这里:

    Using C# 3.0 (.Net 3.5) syntax in a .Net 2.0 application

    全面了解针对 .NET 2.0 Framework 和使用 C# 3.0 时可以做什么和不可以做什么。

    总结:

    扩展方法有点工作,但是,它们需要“System.Runtime.CompilerServices.ExtensionAttribute”才能工作,并且这种类型可以在 System.Core DLL 中找到(严格来说,它不是 .NET 2.0 的一部分框架)。

    可以说,查询语法不能“开箱即用”,但是,如果使用第 3 方 DLL(如 LINQBridge),则可以使用它。此 DLL 有效地重新实现了在以 .NET 2.0 框架为目标时执行 LINQ 所需的许多“缺失”类型。它还实现了扩展方法工作所需的“ExtensionAttribute”类型,因此只需从项目中添加/引用 LINQBridge DLL 即可启用 LINQ、查询语法/表达式和扩展方法!

    【讨论】:

    • 乔恩打败了我。在一个奇怪的命运转折中,我链接到的博客文章的第一条评论来自 Jon Skeet(!)
    • 第二个“你不能”——你可以使用查询语法——只是它们不存在,除非你使用像 LINQBridge 这样的东西。
    • @Marc - 你是对的。感谢您指出了这一点。我已经编辑了我的答案以反映这一事实。
    • 事实很有趣......我会接受你的回答,因为乔恩有很多声誉:P
    猜你喜欢
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多