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#.
Zalecana akcja
Upewnij się, że logika nie zakłada, że #if
NETCOREAPP3_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.1
elementu .
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