こないだ出た Visual Studio 2019 RC1 / Preview 4に対応したバージョンの .NET Core 3 Preview が出たみたいですね。

.NET Core 3.0、最近なんかずっと、Visual Studio より結構遅れてのリリースですよね… おかげで、C# 8.0 のコードがエラーになってたり(今回は、Range構造体の仕様変更が原因)。

Preview 3 での更新点

さらっと内容まとめると、

  • .NET Core 3.0 の正式リリースは今年後半っぽい。詳しくは今年の build
  • 細かいインストールは上書きになる。パッチ バージョンの百のけたが同じものを同一視
    • 3.0.100 があるときに 3.0.101 を入れると 100 は消える
    • 3.0.200 を入れると 3.0.100 とか 3.0.101 とかは残る
  • Docker がらみ、おかしかったの/不便だったの修正
  • Visual Studio 2019 RC1 / Preview 4 の C# 8.0 の Range がちゃんと動くように
  • .NET Standard 2.1 を使えるように
  • F# 4.6 に。dotnet fsi コマンドで F# Intaractive 起動
  • AssemblyDependencyResolver とか NativeLibrary とか、native 相互運用してる人にはうれしそうなもの追加
  • WPF/WinForms とか Entity Framework とか更新
  • 他は、Preview 1のときPreview 2のときの告知を見て

とか。

C# 8.0

ちなみに、TargetFrameworknetcoreapp3.0netstandard2.1 にすると、 デフォルトの状態で C# 8.0 になるみたいです。 TargetFramework だけで、ビルド ツールも .NET Core 3.0 のものに切り替わる模様。 (.NET Core 3.0 が正式リリースされた暁には C# 8.0 も正式リリースになる予定なので、 .NET Core SDK 3 にとっては C# 8.0 がデフォルトになります。)

ということで、ターゲットが .NET Core 3.0 か .NET Standard 2.1 のときは、特に <LangVersion>preview</LangVersion> とか書かなくてもよくなります。 (netcoreapp2.2 とかがターゲットだとやっぱりこのタグが必要。あくまで新しいターゲットの時だけの切り替わり。)

RC1 の方だと「プレビューの .NET Core SDK を使用」オプションをオンにしないといけないのだけはご注意を。

.NET Standard 2.1

やっと、 .NET Standard も 2.1 になったわけですが。詳細は以下のページで見れます。

大体は、「.NET Core の方に追いついた」って感じの API 追加です。

.NET Core 3.0 がらみも結構ちゃんと入っています。 C# 8.0 に必要な Range/Index や、IAsyncEnumerable/IAsyncDisposable も含む。 でも、.NET Standard 的にはバージョン 2.1。

ただ、Hardware Intrinsicsは入れないとのこと。 なんせ、Intrinsics はランタイムのサポートがあって初めて成り立つものなので、「どのランタイムで動かすかわからない .NET Standard にとっては意味がないから」とのこと。

ちなみに、追加が多いのは以下の辺り。

  • Span<T> がらみ
    • System とか System.IO とかの更新点は半分くらいは Span がらみ
  • System.MathF とか、浮動小数点数がらみの追加結構あり
  • これまで NuGet 提供だったものがいくつか標準入り
  • 動的コード生成(System.Reflection.Emit) の辺りは丸々新規追加
    • もちろん、動的コード生成できないプラットフォームはあるわけで、その辺りはRuntimeFeature クラスIsDynamicCodeCompiled, IsDynamicCodeSupported で判定
  • System.Drawing にやたらと差分が多いのは、たぶん SystemColors をサポートしたせい
    • enum 値1個1個が「追加 API」にカウントされてそう