Is it possible to conditionally compile to .NET Framework version?

.net, .net-4.0, c#, conditional-compilation

Solution

If you are using the .NET Core build system, you can use its predefined symbols:

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

The list of predefined symbols is documented in Developing Libraries with Cross Platform Tools and #if (C# Reference):

.NET Framework: `NETFRAMEWORK`, `NET48`, `NET472`, `NET471`, `NET47`, `NET462`, `NET461`, `NET46`, `NET452`, `NET451`, `NET45`, `NET40`, `NET35`, `NET20`

.NET Standard: `NETSTANDARD`, `NETSTANDARD2_1`, `NETSTANDARD2_0`, `NETSTANDARD1_6`, `NETSTANDARD1_5`, `NETSTANDARD1_4`, `NETSTANDARD1_3`, `NETSTANDARD1_2`, `NETSTANDARD1_1`, `NETSTANDARD1_0`

.NET 5+ (and .NET Core): `NET`, `NET6_0`, `NET6_0_ANDROID`, `NET6_0_IOS`, `NET6_0_MACOS`, `NET6_0_MACCATALYST`, `NET6_0_TVOS`, `NET6_0_WINDOWS`, `NET5_0`, `NETCOREAPP`, `NETCOREAPP3_1`, `NETCOREAPP3_0`, `NETCOREAPP2_2`, `NETCOREAPP2_1`, `NETCOREAPP2_0`, `NETCOREAPP1_1`, `NETCOREAPP1_0`

Problem

I can recall back when working with MFC you could support multiple versions of the MFC framework by checking the `_MFC_VER` macro. I'm doing some stuff now with .NET 4 and would like to use Tuple in a couple of spots but still keep everything else 3.5 compatible. I'm looking to do something like: ``` #if DOTNET4 public Tuple<TSource, TResult> SomeMethod<TSource, TResult>(){...} #else public KeyValuePair<TSource, TResult> SomeMethod<TSource, TResult>(){...} #endif ```

Original source

Related problems