一昨日、Visual Studio 2019 16.2 の Generally Available と 16.3 の Preview 1 が出ました。 あと、.NET Core 3.0 Preview 7 も出ました。

16.2 の機能:

  • テスト エクスプローラーの UI が見やすくなった

16.3 Preview 1 の機能:

  • 起動画面でのプロジェクト検索や、プロジェクト テンプレートの検索がしやすくなった
  • .NET Core 3.0 や C# 8.0 のサポート追加
    • LangVersion8.0preview にしなくても 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 許容参照型で困るという話。)