【问题标题】:C# .NET 3.0/3.5 features in 2.0 using Visual Studio 2008使用 Visual Studio 2008 的 2.0 中的 C# .NET 3.0/3.5 功能
【发布时间】:2010-09-15 10:38:36
【问题描述】:

升级到 Visual Studio 2008 后,在 .NET 2.0 中可以使用哪些特定于 C# 3.0/3.5 的新功能?另外,还有哪些功能不可用?

可用

  • Lambdas
  • 扩展方法(通过声明一个空的 System.Runtime.CompilerServices.ExtensionAttribute)
  • 自动属性
  • 对象初始化器
  • 集合初始化器
  • LINQ to Objects(通过实现 IEnumerable 扩展方法,请参阅LinqBridge

不可用

  • 表达式树
  • WPF/Silverlight 库

【问题讨论】:

  • 表达式树可通过使用 Mono 获得。请参阅下面的答案。

标签: c# .net visual-studio


【解决方案1】:

您可以使用任何由编译器处理的新 C# 3.0 功能,方法是发出与 2.0 兼容的 IL,并且不引用任何新的 3.5 程序集:

  • Lambdas(用作Func<..>,而不是Expression<Func<..>>
  • 扩展方法(通过声明一个空的System.Runtime.CompilerServices.ExtensionAttribute
  • 自动属性
  • 对象初始化器
  • 集合初始化器
  • LINQ to Objects(通过实现 IEnumerable<T> 扩展方法,请参阅 LinqBridge

【讨论】:

    【解决方案2】:

    几乎所有东西! Daniel Moth 涵盖了这个 herehere。这只剩下运行时支持:LINQ-to-Objects 由LINQBridge 提供——它只剩下更大的 API,如 Expression 支持,以及 LINQ-to-SQL 等工具。这些太大而无法合理地移植回 .NET 2.0,所以我会为这些使用 .NET 3.5。

    【讨论】:

      【解决方案3】:

      我在article on my site 中对此进行了介绍。

      当面向 .NET 2.0 时,几乎所有 C# 3.0 功能都可用。对于扩展方法,您需要定义一个额外的属性。表达式树根本不可用。查询表达式支持基于“正常”C# 规则后跟的翻译,因此您需要一些东西来提供 Select、Where 等方法。 LINQBridge 是事实上的标准“.NET 2.0 中的 LINQ to Objects”实现。您可能希望在 FuncAction 委托系列中声明委托,以便更轻松地使用 lambda 表达式 - 然后在迁移到 .NET 3.5 时删除它们

      【讨论】:

        【解决方案4】:

        要定义扩展方法,如果您的目标是 .NET 2.0,则需要提供以下类:

        namespace System.Runtime.CompilerServices {
          [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
            sealed class ExtensionAttribute : Attribute { }
        }
        

        【讨论】:

        • 我也必须这样做(发现你在另一个网站上建议这样做)才能在 3.5 SP1 项目中使用 Ninject 1.0 for 2.0。很奇怪...
        【解决方案5】:

        之前有一个关于类似内容的讨论,您可能也想阅读:

        Targeting .NET Framework 3.5, Using .NET 2.0 Runtime. Caveats?

        【讨论】:

          【解决方案6】:

          您可以使用完全支持 LINQ 和表达式树的 Mono 版本的 System.Core。 我针对 .net 2.0 编译了它的源代码,现在我可以在我的 .net2.0 项目中使用它。 这对于需要部署在 .net3.5 不可用的 win2k 上的项目非常有用。

          【讨论】:

          • 这些表达式树需要 .Net 2.0 SP1 吗?
          • 不。普通的旧 .NET 2.0。即使在 win2k 机器上也能很好地工作。
          【解决方案7】:

          Lambda 和扩展方法完全由编译器处理,可以与 .Net 2.0 框架一起使用。

          【讨论】:

          • Lambdas 作为代表,是的。但是作为表达式的 lambda 依赖于 .NET 3.5 中的 Expression 类。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          相关资源
          最近更新 更多