Question

Je me souviens en arrière lorsque vous travaillez avec MFC, vous pouvez prendre en charge plusieurs versions du framework MFC en cochant la macro _MFC_VER.

Je fais des choses maintenant avec .NET 4 et que vous souhaitez utiliser Tuple dans quelques endroits, mais toujours garder tout le reste 3,5 compatible.

Je cherche à faire quelque chose comme:

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
Était-ce utile?

La solution

Il n'y a pas de constantes BUILTIN précompilateur que vous pouvez utiliser. Mais, il est assez facile de créer vos propres configurations de construction VS avec chaque configuration ayant son propre ensemble de constantes définies et bien sûr une version cadre cible. Beaucoup de gens le faire pour compiler conditionnel à 32 ou 64 différences de bits.

Autres conseils

Il y a une grande mise en garde à être au courant lors de la définition des symboles de compilation personnalisée dans votre .csproj (ou .vbproj, théoriquement): ils écrasent tous les symboles de compilation précédemment définis. Par exemple, pensez extrait MSBuild:

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

Le second élément de DefineConstants sera, comme sa valeur indique, écraserait la première valeur de DefineConstants. Pour éviter cela, vous aurez envie de réécrire le deuxième élément de DefineConstants pour ressembler à ceci:

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

En outre, vous aurez envie de mettre cela à l'intérieur d'un PropertyGroup défini après tous les autres PropertyGroups, comme Visual Studio 2010 ajoute actuellement en symboles de compilation personnalisés de telle sorte qu'il écraserait toute autre mesure symboles de compilation que vous définissez si elles sont placées avant Visual studio sa définition laisse tomber. J'ai déposé ce problème avec Microsoft. Vous pouvez suivre sa progression à Microsoft Connect .

Sur une note de côté, votre code de compilation conditionnelle frustrer les programmeurs qui la rencontrent.

Edité, en fonction des commentaires

Il est sans doute préférable d'écrire votre propre classe afin que vous puissiez garantir ce qu'il va faire, et vous n'avez des problèmes de signature ou de succession étranges:

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
}

Comme toujours, il est bon de peser en utilisant les trucs intégrée contre le déploiement de votre propre code. En général, cela signifie que vous demander, « Suis-je OK maintenir et de soutenir ce code? » vs « Est-ce que le code fais ce que je besoin pour, hors de la boîte? »

Dans ce cas, puisque vous n'êtes pas assuré d'avoir Tuple<T1, T2>, je venais d'écrire votre propre simple pour que d'autres développeurs peuvent respirer:)

Comme vous devriez avoir différents projets, vous pourriez avoir des classes partielles et seulement référence à celui que vous avez besoin pour chaque projet avec la logique spécifique pour eux:

classname.cs     classname partielle du public {...}

classname.40.cs     classname partielle du public {          publique Tuple SomeMethod () {...}     }

classname.35.cs     classname partielle du public {          publique KeyValuePair SomeMethod () {...}     }

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top