针对.NET 2.0的VS2008并没有阻止我使用C#3功能

时间:2010-01-22 16:17:38

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

我有一个VS2005解决方案,想要在新的一年里下VS2005。我对升级过程感到非常满意,并且惊喜地发现我的构建脚本大部分仍然有效。

我的问题是围绕多目标功能 - 我的服务器上没有安装.NET 3.5,所以我必须继续以.NET 2.0为目标。这主要是有效的,但我发现我可以做像

这样的事情
var returnMe = "result: " + result.ToString();

...并且仍然成功调试项目。

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

那么,我应该期待哪一个?

  1. VS2008,针对.NET 2.0,在我尝试做C#3事情时应该抛出错误
  2. 构建服务器,意识到我的目标是.NET 2.0,应该理解我正在做的事情并将事物编译成2.0兼容的二进制文件
  3. 有什么想法吗?

5 个答案:

答案 0 :(得分:5)

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

许多.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

上有一篇内容非常丰富的帖子

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

正如其他人所说,使用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版本与您的应用程序一起发布。

答案 3 :(得分:0)

如果你想定位一个特定的版本,你可以通过配置设置来做到这一点(这正是我刚读过的70-536考试,非常干的东西!)。

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

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

然后,无论机器如何,您都可以强制所有构建版本使用相同的版本,这样可以帮助您强制调试以使用正确的版本。

答案 4 :(得分:0)

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

  • Windows Presentation Foundation(WPF)
  • Windows Communication Foundation(WCF)
  • Windows Workflow Foundation(WWF)
  • Windows CardSpace(WCS)

然后你或多或少都安全,尽管我还是建议进行彻底的测试。

你可以使用像var等.Net 3.0这样的功能,因为VS2008不关心框架的目标版本,例如即时语法检查,IntelliSence和可能是其他人据我所知,VS2010 关注这些事情,这会阻止您在定位2.0框架版本时成功编译“var x = ...”构造。