代码之家  ›  专栏  ›  技术社区  ›  dnord

以.NET 2.0为目标的VS2008并不能阻止我使用C_3功能

  •  4
  • dnord  · 技术社区  · 15 年前

    我有一个VS2005解决方案,想在新的一年里摆脱VS2005。我对升级过程非常满意,很高兴看到我的构建脚本大部分仍然有效。

    我的问题是关于多目标功能-我的服务器上没有安装.NET 3.5,因此我必须继续以.NET 2.0为目标。大多数情况下,这是可行的,但我发现我可以做

    var returnMe = "result: " + result.ToString();
    

    …并且仍然成功地调试项目。

    当我将代码提交到构建服务器时,构建失败,说“var”没有定义。

    那么,我应该期待什么呢?

    1. 以.NET 2.0为目标的VS2008应该在我尝试执行C 3操作时抛出错误。
    2. 构建服务器知道我的目标是.NET 2.0,应该理解我在做什么,并将它编译成一个2.0兼容的二进制文件。

    有什么想法吗?

    5 回复  |  直到 15 年前
        1
  •  5
  •   Jay    15 年前

    问题似乎是 构建服务器 没有正确的编译器。你可以在你的工作站上建立它,对吗?

    许多.NET3.0的“特性”只是在编译时返回到clr 2代码的语法位。 var 是其中之一——编译时,编译器将var转换为适当的类型。

    关于这方面有一个相当有用的帖子 http://weblogs.asp.net/shahar/archive/2008/01/23/use-c-3-features-from-c-2-and-net-2-0-code.aspx

        2
  •  1
  •   JaredPar    15 年前

    当您使用Visual Studio 2008以2.0运行时为目标时,仍然使用C编译器的3.0版本来编译代码。在2005年到2008年间,clr运行时本身的变化不大。实际上,它只是核心clr的一个服务包,并添加了几个新库(特别是system.core.dll)。

    因此,2008年添加的大多数功能在2.0运行时运行正常。这是完全合法的,如果您试图使用在2.0中不起作用的功能,您将在生成时或发布时遇到错误。

        3
  •  1
  •   Daniel    15 年前

    正如其他人所说,当使用C 3.0编译器针对.NET 2.0运行时时时,可以使用C 3.0功能。

    与此相关的一个鲜为人知的事实是,如果提供自己的LINQ实现,您甚至可以将LINQ与.NET 2.0一起使用。

    下面是一个启用“select”和“where”运算符的示例:

    namespace System.Runtime.CompilerServices
    {
        // defining this attribute allows using extension methods with .NET 2.0
        [AttributeUsage(AttributeTargets.Method)]
        public sealed class ExtensionAttribute : Attribute {}
    }
    
    namespace System
    {
        public delegate R Func<A, R>(A arg0);
    }
    
    namespace System.Linq
    {
        public static class Enumerable
        {
            public static IEnumerable<R> Select<T, R>(this IEnumerable<T> input, Func<T, R> f)
            {
                foreach (T element in input)
                    yield return f(element);
            }
    
            public static IEnumerable<T> Where<T>(this IEnumerable<T> input, Func<T, bool> f)
            {
                foreach (T element in input) {
                    if (f(element))
                        yield return element;
                }
            }
        }
    

    如果您想充分利用.NET 2.0上的Linq,可以将Mono的System.Core版本随应用程序一起发布。

        4
  •  0
  •   Ian    15 年前

    如果你想确定一个特定的构建目标,你可以通过配置设置来实现(这正是我刚刚阅读的70-536测试的内容,非常干燥的东西!).

    在app.exe.config文件中添加如下内容

    <configuration>
       <startup>
          <requiredRuntime version="v2.0.50727"/>
       </startup>
    </configuration>
    

    然后,您可以强制所有生成使用相同的版本,而不管机器是什么,应该也可以帮助您强制调试使用正确的版本。

        5
  •  0
  •   Igor Korkhov    15 年前

    如果不使用以下库/技术:

    • Windows演示文稿基金会(WPF)
    • Windows通信基金会(WCF)
    • Windows工作流基金会(WWF)
    • Windows卡空间(WCS)

    那么你或多或少是在安全方面,尽管我还是建议你进行彻底的测试。

    您可以使用.NET 3.0功能,例如 var 等等,只是因为当涉及到动态语法检查、智能化以及其他方面时,VS2008并不关心框架的目标版本。据我所知,VS2010 注意这些事情,这会妨碍你成功编译你的“ var x = ... “针对2.0框架版本时的构造。