我有一个VS2005解决方案,想要在新的一年里下VS2005。我对升级过程感到非常满意,并且惊喜地发现我的构建脚本大部分仍然有效。
我的问题是围绕多目标功能 - 我的服务器上没有安装.NET 3.5,所以我必须继续以.NET 2.0为目标。这主要是有效的,但我发现我可以做像
这样的事情var returnMe = "result: " + result.ToString();
...并且仍然成功调试项目。
当我将代码添加到构建服务器时,构建失败,说没有定义“var”。
那么,我应该期待哪一个?
有什么想法吗?
答案 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)
如果您不使用以下库/技术:
然后你或多或少都安全,尽管我还是建议进行彻底的测试。
你可以使用像var
等.Net 3.0这样的功能,因为VS2008不关心框架的目标版本,例如即时语法检查,IntelliSence和可能是其他人据我所知,VS2010 会关注这些事情,这会阻止您在定位2.0框架版本时成功编译“var x = ...
”构造。