一昨日、Visual Studio 2019 16.2 の Generally Available と 16.3 の Preview 1 が出ました。 あと、.NET Core 3.0 Preview 7 も出ました。
- Visual Studio 2019 version 16.2 Generally Available and 16.3 Preview 1
- Announcing .NET Core 3.0 Preview 7
16.2 の機能:
- テスト エクスプローラーの UI が見やすくなった
16.3 Preview 1 の機能:
- 起動画面でのプロジェクト検索や、プロジェクト テンプレートの検索がしやすくなった
-
.NET Core 3.0 や C# 8.0 のサポート追加
LangVersion
を8.0
やpreview
にしなくても C# 8.0 が有効
.NET Core 3.0 Preview 7
- Go Live (自己責任で、製品環境で使ってもいい状態)になった
-
インストール サイズ改善
- インストーラーの状態で3割減、インストール後のディスク サイズで 75%減
- Alpine の Docker イメージのサイズが 148MB に
.NET Core 3.0/C# 8.0
ようやく、.NET Core 3.0/C# 8.0 が最終形になってきました。
前述の通り、Visual Studio 16.3 ではもう C# 8.0 が default です。
LangVersion
の明示は要らなくなりました。
.NET Core 3.0 が Go Live になったので、今後、Generally Available になるまであまり変化はないはずです。
素直に「もう完成してる」「バグ修正を除けばもう変化はない」と言えればすっきりするんですけどね… null 許容参照型がらみがどうもまだリリースされ切っていないようで。
(まあ、null 許容参照型の変化は文法には関係なくて、「C# コンパイラーが属性をどう扱うか」で「警告の有無が変わる」というものです。 一応、文法自体はもうさすがに今後 C# 8.0 の正式リリースまでに変化することはないと思います。)
null 許容参照型
ブログ的に Visual Studio 16.2 Preview 4 (7月19日に出てた)の話はすっ飛ばしちゃいましたが、 16.2 Preview 4 辺りでだいぶ null 許容参照型の実装は進んでいました。 ただ、ちゃんと実装されているようなされていないような…
例えば以下のようなコード。
using System;
using System.Diagnostics.CodeAnalysis;
public class Program
{
static void Main()
{
// MaybeNull が付いているので、string だけど null が返ることがある
var a = MaybeNull<string>();
Console.WriteLine(a.Length); // 警告
// NotNull が付いているので、string? だけど null は返ってこない
var b = NotNull<string?>();
Console.WriteLine(b.Length);
}
[return: MaybeNull]
static T MaybeNull<T>() => default; // ただ、ここで警告出ちゃう(出ないのが正しいはず)
[return: NotNull]
static T NotNull<T>() where T : class? => default;
}
MabyNull
/NotNull
属性、使う側は対応しているけど、メソッド定義側が対応していなかったり。
この辺りは Visual Studio 16.3 Preview 1 でも変化なし。
C# によるプログラミング入門に null 許容参照型のページを追加し始めてるんですけど、 まだリリースに含まれていない挙動が多くて書きづらい… (先週こっそり書き始めてこっそりもうページはあるんですけど、背景説明だけで力尽きてる。)
roslyn 上の issue からたどるに、 実装自体はあって、結構 merge 済みのものも多いんですけども。 まだリリースには反映されていないようです。
あと、今からマイルストーンを 3.0 に変えて大丈夫なの?という issueもあったり。 (型引数に対して属性を付けたい、付けれないと null 許容参照型で困るという話。)