Das NETCOREAPP3_1-Präprozessorsymbol ist nicht definiert, wenn .NET 5 als Zielversion verwendet wird

In .NET 5 RC2 und höher definieren Projekte keine Präprozessorsymbole mehr für frühere Versionen, sondern nur für die Zielversion. Dieses Verhalten entspricht dem von .NET Core 1.0 bis .NET Core 3.1.

Eingeführt in Version

5.0 RC2

Änderungsbeschreibung

In .NET 5 Preview 7 bis .NET 5 RC1 definieren Projekte für net5.0 die Präprozessorsymbole NETCOREAPP3_1 und NET5_0. Durch diesen Behavior Change sind Symbole für die bedingte Kompilierung ab .NET 5 kumulativ.

Ab .NET 5 RC2 definieren Projekte nur Symbole für die Zielframeworkmoniker, nicht jedoch für frühere Versionen.

Grund für die Änderung

Die Änderung aus Preview 7 wurde aufgrund von Kundenfeedback zurückgenommen. Kunden waren überrascht und verwirrt, dass sie Symbole für frühere Versionen definieren mussten, und einige hielten dies für einen Fehler im C#-Compiler.

Stellen Sie sicher, dass Ihre #if-Logik nicht von einer vorhandenen NETCOREAPP3_1-Definition ausgeht, wenn das Projekt auf net5.0 oder höher ausgerichtet ist. Es sollte stattdessen davon ausgegangen werden, dass NETCOREAPP3_1 nur definiert ist, wenn das Projekt explizit auf netcoreapp3.1 ausgerichtet ist.

Wenn Ihr Projekt beispielsweise .NET Core 2.1 und .NET Core 3.1 als Zielversionen verwendet und Sie APIs aufrufen, die in .NET Core 3.1 eingeführt wurden, sollte Ihre #if-Logik folgendermaßen aussehen:

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

Betroffene APIs