我可以回想起使用MFC时,可以通过检查_MFC_VER
宏来支持MFC框架的多个版本。
我现在正在使用.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>
此外,您希望将其放置在所有其他PropertyGroups中定义的PropertyGroup中[[after,因为Visual Studio 2010当前以这样的方式添加了自定义编译符号:它将破坏您定义的任何其他自定义编译符号如果将它们放在Visual Studio降低其定义之前。我已将此问题提交给Microsoft。您可以在Microsoft Connect上跟踪其进度。
编辑,根据评论
最好编写自己的类,这样就可以保证它将要做什么,并且不存在任何奇怪的签名或继承问题: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
}
与往常一样,最好使用内置的东西进行权衡,而不要发布自己的代码。通常,这意味着问自己:“我可以维护并支持此代码吗?”与“开箱即用,代码是否满足我的需要?”在这种情况下,由于不能保证您拥有
Tuple<T1, T2>
,因此我只编写您自己的简单代码,以便其他开发人员可以轻松进行::]
classname.cs公共部分类名{...}
classname.40.cs公共部分类名{公共元组SomeMethod(){...}}
classname.35.cs公共部分类名{公共KeyValuePair SomeMethod(){...}}
#if NET40
public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
Developing Libraries with Cross Platform Tools和#if (C# Reference)中记录了预定义符号的列表:。NET Framework:
NETFRAMEWORK
,NET20
,NET35
,NET40
,NET45
,NET451
,NET452
,NET46
,NET461
,NET462
,NET47
,NET471
,NET472
,NET48
。NET标准:
NETSTANDARD
,NETSTANDARD1_0
,NETSTANDARD1_1
,NETSTANDARD1_2
,NETSTANDARD1_3
,NETSTANDARD1_4
,NETSTANDARD1_5
,NETSTANDARD1_6
,NETSTANDARD2_0
,NETSTANDARD2_1
] >。NET Core:
NETCOREAPP
,NETCOREAPP1_0
,NETCOREAPP1_1
,NETCOREAPP2_0
,NETCOREAPP2_1
,NETCOREAPP2_2
,NETCOREAPP3_0