preprocesador elif directives defines debug c# .net .net-4.0 conditional-compilation

c# - elif - ¿Es posible compilar condicionalmente a la versión de.NET Framework?



environment debug c# (4)

Como debería tener diferentes proyectos, podría tener clases parciales y solo hacer referencia a la que necesita para cada proyecto con la lógica específica para ellos:

classname.cs public parcial classname {...}

classname.40.cs public parcial classname {public Tuple SomeMethod () {...}}

classname.35.cs public parcial classname {public KeyValuePair SomeMethod () {...}}

Puedo recordar que cuando trabaje con MFC, podría admitir varias versiones del marco MFC al verificar la macro _MFC_VER .

Ahora estoy haciendo algunas cosas con .NET 4 y me gustaría usar Tuple en un par de lugares, pero igual mantengo todo lo demás compatible con 3.5.

Estoy buscando hacer algo como:

#if DOTNET4 public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...} #else public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...} #endif


En una nota al margen, el código de compilación condicional frustrará a los programadores que lo encuentren.

Editado, basado en comentarios.

Probablemente sea mejor escribir tu propia clase para poder garantizar lo que va a hacer, y no tienes ningún problema extraño de firma o herencia:

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 }

Como siempre, es bueno sopesar el uso de las cosas integradas en lugar de implementar su propio código. En general, eso significa preguntarse: "¿Estoy de acuerdo con mantener y admitir este código?" "¿El código hace lo que necesito, fuera de la caja?"

En este caso, ya que no se garantiza que tengas Tuple<T1, T2> , solo escribiría tu propio sencillo para que otros desarrolladores puedan respirar con facilidad :)


Hay una gran advertencia a tener en cuenta al definir símbolos de compilación personalizados en su .csproj (o .vbproj, teóricamente): sobrescriben todos los símbolos de compilación definidos previamente. Por ejemplo, considere el fragmento de código de MSBuild:

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

El segundo elemento DefineConstants, como sugiere su valor, aplastará el primer valor de DefineConstants. Para evitar esto, querrá volver a escribir el segundo elemento DefineConstants para que se vea así:

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

Además, querrá colocar esto dentro de un grupo de propiedades definido después de todos los demás grupos de propiedades, ya que Visual Studio 2010 actualmente agrega símbolos de compilación personalizados de tal manera que pegará cualquier otro símbolo de compilación personalizado que defina si se colocan antes de Visual El estudio deja caer su definición. He archivado este problema con Microsoft. Puedes seguir su progreso en Microsoft Connect .


No hay constantes de precompilador incorporadas que pueda utilizar. Pero es bastante fácil crear sus propias configuraciones de compilación en VS, ya que cada configuración tiene su propio conjunto de constantes definidas y, por supuesto, una versión de marco de destino. Mucha gente hace esto para compilar condicionalmente las diferencias de 32 o 64 bits.