Domanda

Posso ricordare indietro quando si lavora con MFC si potrebbe supportare più versioni del framework MFC controllando la macro _MFC_VER.

Sto facendo alcune cose ora con .NET 4 e vorrei utilizzare tupla in un paio di punti, ma ancora tenere tutto il resto 3.5 compatibile.

sto cercando di fare qualcosa di simile:

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

Soluzione

Non ci sono costanti pre-compilatore incorporate che è possibile utilizzare. Ma, è abbastanza facile creare le proprie configurazioni di costruire in VS con ogni configurazione ha una propria serie di costanti definite e, naturalmente, una versione di framework di destinazione. Un sacco di gente fare questo a modo condizionale compilano a base di 32 o 64 bit differenze.

Altri suggerimenti

C'è un grande avvertimento di essere a conoscenza di quando si definisce simboli di compilazione personalizzato nel .csproj (o vbproj, teoricamente): essi sovrascrivono simboli di compilazione tutti precedentemente definiti. Ad esempio, si consideri MSBuild frammento:

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

Il secondo elemento DefineConstants sarà, come valore suggerisce, clobber il primo valore di DefineConstants. Per evitare questo, ti consigliamo di riscrivere il secondo elemento DefineConstants a guardare in questo modo:

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

Inoltre, ti consigliamo di inserire questo all'interno di un PropertyGroup definito dopo tutti gli altri PropertyGroups, come Visual Studio 2010 attualmente aggiunge in simboli di compilazione personalizzati in modo tale che possa clobber qualsiasi altro personalizzato simboli di compilazione è possibile definire se essi sono posti prima di Visual Studio lascia cadere la sua definizione. Ho archiviato la questione con Microsoft. È possibile seguire il suo corso al Microsoft Connect .

Una nota a parte, il codice di compilazione condizionale sarà vanificare i programmatori che incontrano esso.

A cura, sulla base dei commenti

E 'probabilmente meglio scrivere la propria classe in modo da poter garantire che cosa sta andando a fare, e non avere problemi di firma o di eredità strani:

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
}

Come sempre, è bene pesare utilizzando la roba built-in contro stendere il proprio codice. In genere questo significa chiedendo se stessi, "Am I OK mantenere e sostenere questo codice?" vs "Fa il codice fare quello che ho bisogno di, fuori dalla scatola?"

In questo caso, dal momento che non la garanzia di avere Tuple<T1, T2>, avevo appena scrivere il proprio semplice in modo che altri sviluppatori possano respirare facile:)

Come si dovrebbe avere progetti diversi, si potrebbe avere classi parziali e fare riferimento solo quello che vi serve per ogni progetto con la logica specifica per loro:

classname.cs     nomeclasse parziale pubblico {...}

classname.40.cs     nomeclasse pubblico parziali {          pubblico Tuple SomeMethod () {...}     }

classname.35.cs     nomeclasse pubblico parziali {          pubblico KeyValuePair SomeMethod () {...}     }

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top