何件か、C# 9.0 向けに提案されている機能のドラフト仕様が出てきました。

パターン マッチ

C# 8.0 でもずいぶんとパターンが増えましたが、9.0 でも追加が出そうです。

  • 複数のパターンを andor でつないだり、!(x is pattern) と書かなくても x is not pattern と書けるようにしたり
  • andor があるなら優先度を付けるために、パターンを () で囲えるようにしたり
  • x is >= min and <= max みたいに、比較パターンを入れたり

switch 式を式ステートメントに

メソッド呼び出しなど、いくつかの式は、式を単体で M(); みたいに書いてステートメント化できます。(こういうのを「式ステートメントと言います。)

switchでも、以下のような書き方に需要があるので、式ステートメント化をしたいという話は前々からあります。

static void A() => Console.WriteLine("A");
static void B() => Console.WriteLine("B");
static void C() => Console.WriteLine("C");
 
static void M(bool? state)
{
    state switch
    {
        true => A(),
        false => B(),
        null => C(),
    };
}

C# 8.0 には間に合わなかったので、9.0 での提案に。

共変戻り値

これは要するに以下のような奴。

class Base { }
class Derived : Base { }
 
class A
{
    public virtual Base M() => null;
}
 
class B
{
    // 戻り値が Base じゃなくて Derived。
    // 原理的には問題ないはずだけど、今までの .NET ではできなかった。
    public override Derived M() => null;
}

これはずっと「C# 上の構文糖衣ではなく、ランタイムに手を入れた方がいいので難しめ」ということでなかなか手付かずだったやつです。

C# 上の構文糖衣で何とかごまかせないかという検討もしていたんですが、 結局、ランタイム(.NET の型システム自体)の修正込みでやろいうという流れになっています。

インターフェイスのデフォルト実装に続く2例目の「ランタイムを選ぶ新機能」になります。