Il simbolo del preprocessore NETCOREAPP3_1 non è definito quando la destinazione è .NET 5

In .NET 5 RC2 e versioni successive i progetti non definiscono più i simboli del preprocessore per le versioni precedenti, ma solo per la versione di destinazione. Si tratta dello stesso comportamento di .NET Core 1.0 - 3.1.

Versione introdotta

5.0 RC2

Descrizione delle modifiche

In .NET 5 preview 7 fino alla RC1, i progetti che hanno come obiettivo net5.0 la definizione di entrambi i simboli del preprocessore NETCOREAPP3_1 e NET5_0. La finalità alla base di questa modifica di comportamento era che a partire da .NET 5, i simboli di compilazione condizionale sarebbero cumulativi.

In .NET 5 RC2 e versioni successive i progetti definiscono solo i simboli per i moniker del framework di destinazione (TFM) destinati e non per le versioni precedenti.

Motivo della modifica

La modifica dall'anteprima 7 è stata ripristinata a causa del feedback dei clienti. La definizione dei simboli per le versioni precedenti ha sorpreso e confuso i clienti e alcuni hanno pensato che si trattasse di un bug del compilatore C#.

Assicurarsi che la logica #if non presupporre che NETCOREAPP3_1 sia definita quando il progetto è destinato a net5.0 o superiore. Si supponga invece che NETCOREAPP3_1 sia definito solo quando il progetto è destinato in modo esplicito a netcoreapp3.1.

Ad esempio, se il progetto è multitarget per .NET Core 2.1 e .NET Core 3.1 e si chiamano LE API introdotte in .NET Core 3.1, la logica #if dovrebbe essere simile alla seguente:

#if NETCOREAPP2_1 || NETCOREAPP3_0
    // Fallback behavior for old versions.
#elif NETCOREAPP
    // Behavior for .NET Core 3.1 and later.
#endif

API interessate

N/D