【问题标题】:Is there a list of changes for C#4.0 that work in .Net 3.5?是否有适用于 .Net 3.5 的 C#4.0 更改列表?
【发布时间】:2011-02-03 09:33:40
【问题描述】:

最近我看到了很多 C# 4.0 的变化。我真的很喜欢其中一些。此外,出于兼容性原因,我还不想继续使用 .Net 4.0。

那么,是否有适用于 .Net 3.5 或更低版本的新 C# 4.0 语言功能的完整列表?

例如,默认参数是否需要 .NET 4.0 CLR,或者它们是编译器功能?可以使用自动属性(C# 3.0 功能)并且仍然以 .NET 2.0 为目标,因为这不需要 Framework 支持,但不需要使用 LINQ 表达式,因为这确实需要 Framework 3.5。

请不要说“当然 C#4.0 不能在 .Net 3.5 中工作,因为它更旧”

【问题讨论】:

  • 我不确定是否有,因为 .NET 4.0 带来了新版本的 CLR。您不能在 2.0 CLR(这是 CLR .NET 3.5 使用的)中运行 .NET 4 程序集。据我所知,C# 4 编译器没有提供针对 3.5 的方法。
  • 例如,默认参数是否需要 .NET 4.0 CLR,或者它们是编译器功能?可以使用自动属性(C# 3.0 特性)并且仍然以 .NET 2.0 为目标,因为它不需要 Framework 支持,但不使用 LINQ 表达式,因为 确实 需要 Framework 3.5。
  • @John,是的,这就是我要问的。我不知道有这么多人认为 C# 与 .Net 相同
  • @Earlz:实际上,您仍然可以使用 LINQ 查询表达式。它们是句法特征。您错过的是 LINQ-to-objects、LINQ-to-XML 和朋友。看看 LinqBridge。
  • @Matt:可能是这样,但 CLR 是新的这一事实并没有强制禁止使用编译器独有的功能,就像您可以使用自动属性和目标 .NET 1.1

标签: c# .net c#-4.0 compatibility


【解决方案1】:

我知道协变和逆变通过 IL 注释 + 和 - 在 CLR 2.0 的类型参数中得到了一些支持。不过不确定其他功能。

【讨论】:

    【解决方案2】:

    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 框架特性。然而,Dynamic 可以,因此开箱即用,它不适用于 3.5。

    这里有一篇关于这个的帖子,涵盖了基础知识。

    http://blogs.msdn.com/ed_maurer/archive/2010/03/31/multi-targeting-and-the-c-and-vb-compilers.aspx

    短名单(来自 Ed 的帖子)是:

    • 命名参数和可选参数
    • 某些 COM 语法改进(例如,“省略 ref”)
    • 一般方差

    不起作用的事情包括动态和无pia(就实施它们所花费的时间而言,我们的两项最大支出)。前者需要框架支持,后者需要运行时支持。

    【讨论】:

    • 很好的答案,但我想我想知道的是 C#4.0 中的哪些功能不依赖于 .Net 4.0 的功能
    • 这很棒。 Ed 的帖子中的一个重要观点:通用方差是,如果您的目标是 3.5,IEnumerable<T> 将不会参与方差功能,因此您将无法摆脱所有烦人的 Cast<T> 调用,直到您可以定位4.0 运行时。
    • @Earlz - 这不是这个答案中项目符号列表的重点吗?
    • 还要感谢 Ed Maurer 等了 18 个月来更新他的(非常有趣的)博客!
    • +! @Daniel,是的,但那是在.. 中编辑的,也是一篇不错的博文。但这基本上涵盖了所有新功能吗?
    【解决方案3】:

    考虑到默认参数已经是 VB.NET 的一个特性,C# 可能只是在编译器级别实现了它。然而,CLR 团队本可以实施一种全新的方式来完全做到这一点。

    您应该准备好修改您的问题以说明“C# 4.0 的哪些功能是适用于 .NET 3.5 框架的编译器更改”

    【讨论】:

      【解决方案4】:

      这不是一个列表,也不是确定的,但作为一个例子,我刚刚建立了一个针对 .NET 3.5 的新 VS2010 项目,并成功创建了一个带有默认参数的方法,并使用命名参数调用它,两者都是C# 4.0 功能。

      【讨论】:

        【解决方案5】:

        我正在考虑对“旧”规范进行更改...lock 更改将不可用,因为这需要新的重载 - 但the "field-like events" change 应该 工作.我必须检查编译器发出的内容;-p

        果然:

        using System;
        class Program
        {
            public event EventHandler SomeHandler;
            static void Main() { }
        }
        

        获取新式访问器;-p

        【讨论】:

        猜你喜欢
        • 2015-05-09
        • 2010-09-10
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多