我记得回来MFC工作时,你可以通过检查支持MFC框架的多个版本_MFC_VER
宏。
我现在做的一些东西与.NET 4中,并想用元组在几个点,但仍保留一切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>
此外,你希望把这个所有其他PropertyGroups 后定义的的PropertyGroup内,如Visual Studio 2010中增加了目前在定制编译符号以这样一种方式,它会揍你定义的任何其他自定义编译符号,如果他们之前放在视觉工作室砰地一声撂下了它的定义。 我已提起诉讼,这次与微软的问题。 您可以跟踪其进度在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(){...}}