Символ препроцессора NETCOREAPP3_1 не определен при ориентации на .NET 5

В .NET 5 RC2 и более поздних версиях в проектах больше не определяются символы препроцессора для более ранних версий. Определяются символы препроцессора только для целевой версии. Это то же самое поведение, что и в .NET Core 1.0–3.1.

Представленные версии

5.0 RC2

Описание изменения

В версиях .NET 5 с предварительной версии 7 до RC1 в проектах, предназначенных для net5.0, определяются символы препроцессора NETCOREAPP3_1 и NET5_0. Цель этого изменения поведения заключается в том, чтобы начиная с .NET 5 символы условной компиляции были накопительными.

В .NET 5 RC2 и более поздних версиях в проектах определяются только символы для моникеров целевой платформы (TFM), для которой она предназначена, а не для предыдущих версий.

Причина изменения

Изменение из предварительной версии 7 было отменено из-за отзывов пользователей. Определение символов для более ранних версий удивило и запутало пользователей, и некоторые предположили, что это ошибка в компиляторе C#.

Убедитесь, что в логике #if не предполагается определение NETCOREAPP3_1, если проект предназначен для net5.0 или более поздней версии. Вместо этого сделайте так, чтобы NETCOREAPP3_1 определялся только в том случае, если проект явно предназначен для netcoreapp3.1.

Например, если проект предназначен для нескольких платформ (.NET Core 2.1 и .NET Core 3.1) и вы вызываете API, которые появились в .NET Core 3.1, то логика #if должна выглядеть следующим образом:

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

Затронутые API

Н/Д