NETCOREAPP3_1 symbol preprocesora nie jest zdefiniowany podczas określania wartości docelowej platformy .NET 5

W wersjach .NET 5 RC2 i nowszych projekty nie definiują już symboli preprocesora dla wcześniejszych wersji, ale tylko dla wersji docelowej. Jest to takie samo zachowanie jak .NET Core 1.0 — 3.1.

Wprowadzona wersja

5.0 RC2

Opis zmiany

W programie .NET 5 (wersja zapoznawcza od 7 do RC1) projekty przeznaczone do net5.0 zdefiniowania symboli preprocesora NETCOREAPP3_1 i NET5_0 preprocesora. Intencją tej zmiany zachowania było to, że począwszy od platformy .NET 5, symbole kompilacji warunkowej będą skumulowane.

W programie .NET 5 RC2 lub nowszym projekty definiują tylko symbole obiektów docelowych monikers (TFM), których dotyczy, a nie dla żadnych wcześniejszych wersji.

Przyczyna wprowadzenia zmiany

Zmiana z wersji zapoznawczej 7 została przywrócona z powodu opinii klientów. Definiowanie symboli dla wcześniejszych wersji zaskoczonych i zdezorientowanych klientów, a niektórzy zakładali, że była to usterka w kompilatorze języka C#.

Upewnij się, że logika nie zakłada, że #ifNETCOREAPP3_1 jest definiowana, gdy projekt jest przeznaczony dla celów net5.0 lub wyższych. Zamiast tego załóżmy, że NETCOREAPP3_1 jest definiowany tylko wtedy, gdy projekt jawnie jest przeznaczony dla netcoreapp3.1elementu .

Jeśli na przykład multitargety projektu dla platformy .NET Core 2.1 i .NET Core 3.1 są wywoływane interfejsy API wprowadzone na platformie .NET Core 3.1, logika #if powinna wyglądać następująco:

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

Dotyczy interfejsów API

Nie dotyczy