【问题标题】:VS2008 targeting .NET 2.0 doesn't stop me from using C# 3 features面向 .NET 2.0 的 VS2008 并没有阻止我使用 C# 3 功能
【发布时间】:2011-01-08 06:51:32
【问题描述】:

我有一个 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 兼容的二进制文件

有什么想法吗?

【问题讨论】:

  • var 不是 .Net 功能 - 它是 C# 功能。

标签: .net visual-studio visual-studio-2008 .net-2.0 multitargeting


【解决方案1】:

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

.NET 3.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 上有一篇内容丰富的帖子

【讨论】:

  • 你会看那个... C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe[.. .] 我敢打赌,如果我指向不同的 MSBuild,这会起作用...谢谢
【解决方案2】:

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

因此,2008 年添加的大部分功能都可以在 2.0 运行时上正常运行。这是完全合法的,如果您尝试使用在 2.0 中不起作用的功能,您将在构建时或发布时遇到错误。

【讨论】:

    【解决方案3】:

    随着其他人表示,在使用C#3.0编译器定位.NET 2.0运行时,可以使用C#3.0功能。

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

    这是一个实现“选择”和“在其中”运算符的示例:

    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;
                }
            }
        }
    

    如果要充分使用LINQ ON .NET 2.0,则可以使用应用程序运送Mono的System.core版本。

    【讨论】:

      【解决方案4】:

      如果您想针对特定构建,您可以通过配置设置来实现(这正是我刚刚为 70-536 考试阅读的内容,非常枯燥的东西!)。

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

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

      然后,您可以强制所有构建使用相同的版本,而不管机器如何,这应该有助于您强制调试也使用正确的版本。

      【讨论】:

        【解决方案5】:

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

        • Windows Presentation Foundation (WPF)
        • Windows 通信基础 (WCF)
        • Windows 工作流基础 (WWF)
        • Windows CardSpace (WCS)

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

        您可以使用 .Net 3.0 功能,如 var 等,因为 VS2008 在涉及即时语法检查、IntelliSence 等问题时​​并不关心框架的目标版本.据我所知,VS2010注意这些事情,这将阻止你在针对 2.0 框架版本时成功编译你的“var x = ...”结构。

        【讨论】:

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