Est-il possible de comstackr conditionnellement à la version .NET Framework?

Je peux rappeler que lorsque vous travaillez avec MFC, vous pouvez prendre en charge plusieurs versions du framework MFC en vérifiant la macro _MFC_VER .

Je travaille actuellement avec .NET 4 et j’aimerais utiliser Tuple à quelques endroits tout en maintenant la compatibilité 3.5.

Je cherche à faire quelque chose comme:

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

Vous ne pouvez utiliser aucune constante de précompilateur intégrée. Cependant, il est assez facile de créer vos propres configurations de construction dans VS, chaque configuration ayant son propre ensemble de constantes définies et bien sûr une version de l’infrastructure cible. Beaucoup de gens le font pour comstackr conditionnellement des différences de 32 ou 64 bits.

Il y a un inconvénient important à prendre en compte lors de la définition de symboles de compilation personnalisés dans votre .csproj (ou .vbproj, en théorie): ils écrasent tous les symboles de compilation définis précédemment. Par exemple, considérons l’extrait de code MSBuild:

   $(DefineConstants);DOTNET_40   ITS_CLOBBERING_TIME  

Le deuxième élément DefineConstants, comme le suggère sa valeur, débloquera la première valeur de DefineConstants. Pour éviter cela, vous voudrez réécrire le deuxième élément DefineConstants pour qu’il ressemble à ceci:

  $(DefineConstants);ITS_CLOBBERING_TIME 

En outre, vous souhaiterez placer ceci à l’intérieur d’un PropertyGroup défini après tous les autres PropertyGroups, car Visual Studio 2010 ajoute actuellement des symboles de compilation personnalisés de manière à masquer tous les autres symboles de compilation personnalisés que vous définissez s’ils sont placés avant Visual. Studio renverse sa définition. J’ai classé ce problème avec Microsoft. Vous pouvez suivre ses progrès sur Microsoft Connect .

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

Edité, basé sur les commentaires

Il est probablement préférable d’écrire votre propre classe afin de pouvoir garantir ce qu’elle va faire, et vous n’avez pas de problème de signature ou d’inheritance étrange:

 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 } 

Comme toujours, il est bon de peser avec les éléments intégrés plutôt que de déployer votre propre code. En règle générale, cela signifie que vous devez vous demander: “Suis-je capable de maintenir et de supporter ce code?” vs “Le code fait-il ce dont j’ai besoin, hors de la boîte?”

Dans ce cas, puisque vous n’êtes pas assuré d’avoir Tuple , j’écrirais simplement votre propre fichier simple afin que les autres développeurs puissent respirer facilement 🙂

Comme vous devez avoir différents projets, vous pouvez avoir des classes partielles et ne référencer que celui dont vous avez besoin pour chaque projet avec la logique spécifique pour ces projets:

classname.cs nom de classe partiel public {…}

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

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