Frage

kann ich erinnere zurück, wenn sie mit MFC arbeiten Sie mehrere Versionen der MFC-Framework durch Überprüfung des _MFC_VER Makro unterstützen könnte.

Ich mache jetzt ein paar Sachen mit .NET 4 und möchte Tuple in ein paar Flecken verwenden, aber immer noch alles andere 3.5 kompatibel zu halten.

Ich suche etwas zu tun:

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

Lösung

Es gibt keinen eingebauten Precompilers Konstanten, die Sie verwenden können. Aber es ist leicht genug, erstellen Sie Ihre eigenen Build-Konfigurationen in VS mit jeder Konfiguration einen eigenen Satz von definierten Konstanten und natürlich ein Ziel Framework-Version. Viele Menschen tun dies bedingt Basis 32 oder 64 Bit Unterschiede kompilieren.

Andere Tipps

Es ist ein großer Nachteil bewusst zu sein, bei der Definition von benutzerdefinierter Kompilierung Symbolen in Ihrem CSPROJ (oder .vbproj, theoretisch): Sie überschreiben alle vorher definierten Zusammenstellung Symbole. Betrachten wir zum Beispiel MSBuild Snippet:

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

Das zweite Element DefineConstants wird, als Wert vermuten lässt, um den ersten Wert von DefineConstants clobber. Um dies zu vermeiden, werden Sie wollen das zweite DefineConstants Element umschreiben wie folgt aussehen:

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

Auch, sollten Sie diese innerhalb eines Property platzieren definiert nach alle anderen PropertyGroups, wie Visual Studio 2010 zur Zeit in Kompilation Symbole so Brauch fügt hinzu, dass es andere benutzerdefinierte clobber wird Kompilierung Symbole festgelegt, ob sie gesetzt werden, bevor Visual Studio plumpst seine Definition nach unten. Ich habe dieses Problem mit Microsoft eingereicht. Sie können den Fortschritt auf Microsoft Connect .

Auf einer Seite beachten, Ihre bedingte Kompilierung Code Programmierer vereiteln, die sie stoßen.

Edited, basierend auf Kommentare

Es ist wahrscheinlich besser Ihre eigene Klasse zu schreiben, so dass Sie garantieren können, was es tun wird, und Sie haben noch keine seltsame Unterschrift oder Erbschaftsangelegenheiten:

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
}

Wie immer ist es gut gegen Ausrollen Ihren eigenen Code mit den eingebauten in Sachen zu wiegen. Im Allgemeinen bedeutet, dass Sie sich fragen: „Bin ich OK beibehalten und diesen Code zu unterstützen?“ vs. „Ist der Code tun, was ich brauche es, aus der Box?“

In diesem Fall, da Sie nicht haben Tuple<T1, T2> garantiert, würde ich nur Ihre eigenen einfache schreiben, damit andere Entwickler können aufatmen:)

Wenn Sie verschiedene Projekte haben, sollten Sie partielle Klassen haben könnten und nur als Referenz, die Sie für jedes Projekt müssen mit der spezifischen Logik für sie:

classname.cs     public partial classname {...}

classname.40.cs     public partial {classname          public Tuple Somemethod () {...}     }

classname.35.cs     public partial {classname          public KeyValuePair Somemethod () {...}     }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top