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

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

我想做类似的事情:

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
有帮助吗?

解决方案

有,你可以使用内置的无预编译常量。但是,这是很容易的与有它自己的一套定义的常量,当然是一个目标框架版本的每个配置创建VS自己的构建配置。很多人为此有条件地编译基于32倍或64位的差异。

其他提示

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

  <PropertyGroup Condition="'$(TargetFrameworkVersion)' == 'v4.0'">
    <DefineConstants>$(DefineConstants);DOTNET_40</DefineConstants>
  </PropertyGroup>
  <PropertyGroup>
    <DefineConstants>ITS_CLOBBERING_TIME</DefineConstants>
  </PropertyGroup>

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

    <DefineConstants>$(DefineConstants);ITS_CLOBBERING_TIME</DefineConstants>

另外,您需要将其放置在定义的 PropertyGroup 中 所有其他 PropertyGroup,因为 Visual Studio 2010 目前添加自定义编译符号的方式是,如果在 Visual Studio 放下其定义之前放置它们,则会破坏您定义的任何其他自定义编译符号。我已向 Microsoft 提交了此问题。您可以在以下位置跟踪其进度 微软连接.

在一个侧面说明,你的条件编译代码将挫败的是遇到它的程序员。

编辑,基于注释

有可能更好地编写自己的类,这样就可以保证它会做的,你没有任何奇怪的签字或继承的问题:

public class Pair<TSource, TResult>
{
    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
}

一如往常,这是很好的使用内置的东西与推出自己的代码来衡量。一般来说,这意味着问自己,“我是OK维护和支持这个代码?”与“代码是否做什么,我需要它,开箱?”

在这种情况下,因为你不能保证有Tuple<T1, T2>,我只是写自己的简单的一个,这样其他开发人员可以轻松呼吸:)

如你应该有不同的项目,可以有局部的类和只引用需要用于与他们的特定逻辑每个项目之一:

classname.cs     公共局部类名{...}

classname.40.cs     公共部分的类名{          公开元组的someMethod(){...}     }

classname.35.cs     公共部分的类名{          公共KeyValuePair的someMethod(){...}     }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top