Le symbole de préprocesseur NETCOREAPP3_1 n’est pas défini lors du ciblage de .NET 5

Dans .NET 5 RC2 et versions ultérieures, les projets ne définissent plus de symboles de préprocesseur pour les versions antérieures, mais uniquement pour la version qu’ils ciblent. Ce comportement est le même que pour .NET Core 1.0 - 3.1.

Version introduite

5.0 RC2

Description de la modification

Dans .NET 5 préversion 7 à RC1, les projets qui ciblent net5.0 définissent à la fois des symboles de préprocesseur NETCOREAPP3_1 et NET5_0. L’intention derrière ce changement de comportement était qu’à compter de .NET 5, les symboles de compilation conditionnelle seraient cumulatifs.

Dans .NET 5 RC2 et versions ultérieures, les projets définissent uniquement des symboles pour les monikers de la version cible de .Net Framework (TFM) qu’ils ciblent et non pour les versions antérieures.

Raison du changement

Le changement de la préversion 7 a été annulée en raison des commentaires des clients. La définition de symboles pour les versions antérieures a surpris et confondu les clients et certains ont supposé qu’il s’agissait d’un bogue dans le compilateur C#.

Assurez-vous que votre logique #if ne suppose pas que NETCOREAPP3_1 est défini lorsque le projet cible net5.0 ou plus. Au lieu de cela, supposons que NETCOREAPP3_1 n’est défini que lorsque le projet cible netcoreapp3.1 explicitement.

Par exemple, si votre projet comporte plusieurs cibles pour .NET Core 2.1 et .NET Core 3.1 et que vous appelez des API qui ont été introduites dans .NET Core 3.1, votre logique #if doit se présenter comme suit :

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

API affectées

N/A