.NET 5 を対象とする場合の NETCOREAPP3_1 プリプロセッサ シンボルが定義されていない

.NET 5 RC2 以降のバージョンでは、プロジェクトでのプリプロセッサ シンボルの定義は対象とするバージョンに対してのみ行われ、以前のバージョンでは行われなくなります。 これは、.NET Core 1.0 - 3.1 と同じ動作です。

導入されたバージョン

5.0 RC2

変更内容

.NET 5 Preview 7 から RC1 では、net5.0 を対象とするプロジェクトで NETCOREAPP3_1NET5_0 の両方のプリプロセッサ シンボルが定義されます。 この動作変更は、.NET 5 以降で、条件付きコンパイルのシンボルが累積になることを意図したものでした。

.NET 5 RC2 以降では、プロジェクトは、以前のバージョンではなく、対象となるターゲット フレームワーク モニカー (TFM) のみに対するシンボルを定義します。

変更理由

Preview 7 からの変更は、お客様からのフィードバックにより元に戻されました。 以前のバージョンのシンボルの定義はお客様を驚かせ、混乱させました。C# のコンパイラにバグがあったと考えたお客様もいました。

プロジェクトが net5.0 以上を対象とするときに NETCOREAPP3_1 が定義されていることを #if ロジックで前提としていないことを確認してください。 代わりに、プロジェクトが netcoreapp3.1 を明示的に対象としている場合は NETCOREAPP3_1 のみが定義されることを前提としてください。

たとえば、プロジェクトが .NET Core 2.1 および .NET Core 3.1 のマルチターゲットで、.NET Core 3.1 で導入された API を呼び出す場合、#if ロジックは次のようになります。

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

影響を受ける API

該当なし