Pregunta

puedo recordar la espalda cuando se trabaja con MFC se podía soportar múltiples versiones del marco MFC mediante la comprobación de la macro _MFC_VER.

Estoy haciendo algunas cosas ahora con .NET 4 y me gustaría utilizar tupla en un par de puntos, pero aún así mantener todo lo demás 3.5 compatibles.

Estoy buscando para hacer algo como:

#if DOTNET4
    public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#else
    public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...}
#endif
¿Fue útil?

Solución

No hay constantes precompilador incorporadas que se pueden utilizar. Sin embargo, es bastante fácil crear sus propias configuraciones de construcción en VS con cada configuración que tiene su propio conjunto de constantes definidas y por supuesto una versión del marco de destino. Mucha gente hace esto a 32 o 64 bits diferencias de compilación condicional en base.

Otros consejos

Hay una advertencia grande como para ser consciente de la hora de definir los símbolos de compilación de encargo en su .csproj (o .vbproj, teóricamente): se sobreescriben los símbolos de compilación de todo previamente definidos. Por ejemplo, considere MSBuild fragmento:

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

El segundo elemento DefineConstants será, como su valor sugiere, clobber el primer valor de DefineConstants. Para evitar esto, tendrá que volver a escribir el segundo elemento DefineConstants a tener este aspecto:

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

Además, tendrá que colocar este en el interior de un PropertyGroup definido después todos los demás PropertyGroups, como Visual Studio 2010 agrega actualmente en símbolos personalizados compilación de tal manera que va a darle una paliza a cualquier otro encargo símbolos de compilación que definen si se colocan antes de Visual Studio deja caer su definición. Me he presentado este problema con Microsoft. Puede hacer un seguimiento de su progreso en el Microsoft Connect .

En una nota, el código de compilación condicional frustrará a los programadores que se encuentran con él.

Editado, basado en los comentarios

Es probablemente mejor para escribir su propia clase para que pueda garantizar lo que va a hacer, y que no tiene ningún problema de firma o de herencia extraños:

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 que sopesar el uso de la materia incorporada contra el despliegue de su propio código. Usualmente esto significa que preguntarse, "¿Estoy bien mantener y apoyar este código?" frente a "¿El código hace lo que yo lo necesito a, fuera de la caja?"

En este caso, ya que no está garantizado para tener Tuple<T1, T2>, que acababa de escribir sus propios sencillo para que otros desarrolladores pueden respirar tranquilos:)

A medida que usted debe tener diferentes proyectos, usted podría tener clases parciales y sólo hacer referencia a la que necesita para cada proyecto con la lógica específica para ellos:

classname.cs     nombre de clase public partial {...}

classname.40.cs     nombre de la clase pública parcial {          pública Tupla SomeMethod () {...}     }

classname.35.cs     nombre de la clase pública parcial {          pública KeyValuePair SomeMethod () {...}     }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top