是否可以有条件地编译到.NET Framework版本?

我可以回想一下,在使用MFC时,您可以通过检查_MFC_VER宏来支持多个版本的MFC框架。

我现在正在使用.NET 4做一些事情,并希望在几个地方使用Tuple,但仍然保持其他所有3.5兼容。

我想做点什么:

 #if DOTNET4 public Tuple SomeMethod(){...} #else public KeyValuePair SomeMethod(){...} #endif 

您没有可以使用的内置预编译常量。 但是,在VS中创建自己的构建配置很容易,每个配置都有自己的一组定义的常量,当然还有目标框架版本。 很多人这样做是为了有条件地编译基于32或64位的差异。

在.csproj(或理论上为.vbproj)中定义自定义编译符号时,需要注意一个重要注意事项:它们会覆盖所有先前定义的编译符号。 例如,考虑MSBuild片段:

   $(DefineConstants);DOTNET_40   ITS_CLOBBERING_TIME  

正如其值所示,第二个DefineConstants元素将破坏DefineConstants的第一个值。 为避免这种情况,您需要重写第二个DefineConstants元素,如下所示:

  $(DefineConstants);ITS_CLOBBERING_TIME 

此外,您还希望将其放置所有其他PropertyGroup 之后定义的PropertyGroup中,因为Visual Studio 2010当前在自定义编译符号中添加了这样的方式,如果它们放在Visual之前它将会破坏您定义的任何其他自定义编译符号Studio摒弃了它的定义。 我已经向微软提交了这个问题。 您可以在Microsoft Connect上跟踪其进度。

另外,您的条件编译代码会使遇到它的程序员感到沮丧。

根据评论编辑

编写自己的类可能更好,这样你就可以保证它会做什么,而且你没有任何奇怪的签名或inheritance问题:

 public class Pair { public TSource Source { get; set; } public TResult Result { get; set; } public Pair() {} public Pair(TSource source, TResult result) { Source = source; Result = result; } // Perhaps override Equals() and GetHashCode() as well } 

与往常一样,使用内置的东西与推出自己的代码进行权衡是很好的。 一般来说,这意味着问自己,“我能维护并支持这些代码吗?” 与“代码是否完成了我需要的东西,开箱即用?”

在这种情况下,由于你不能保证有Tuple ,我只是编写你自己的简单的,所以其他的开发人员可以轻松呼吸:)

由于您应该有不同的项目,您可以拥有部分类,并且只引用每个项目所需的部分类及其特定逻辑:

classname.cs public partial classname {…}

classname.40.cs public partial classname {public Tuple SomeMethod(){…}}

classname.35.cs public partial classname {public KeyValuePair SomeMethod(){…}}