4

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

有任何想法吗?

4

5 回答 5

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

于 2010-01-22T16:25:08.940 回答
1

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

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

于 2010-01-22T16:21:47.843 回答
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 版本与您的应用程序一起提供。

于 2010-01-22T18:45:48.917 回答
0

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

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

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

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

于 2010-01-22T16:29:12.233 回答
0

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

  • Windows 演示基础 (WPF)
  • Windows 通信基础 (WCF)
  • Windows 工作流基金会 (WWF)
  • Windows CardSpace (WCS)

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

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

于 2010-01-22T16:35:54.327 回答