目次

Ver. 8.0

随時更新。

予定: https://github.com/ufcpp/UfcppSample/issues/208

  • Visual Studio 2019 のリリース時点では、C# 8.0 はプレビュー版という扱いになります
    • 予定している機能も全ては実装されておらず、実装されている機能も自己責任での利用をお願いします
  • プレビューでもいいので C# 8.0 を使いたい場合、言語バージョン8.0preview を指定
  • プレビューとはいえ割かし安定して使えそうなものについては以前書いたブログを参照

再帰パターン

C# 7.0 で部分的にパターン マッチングが実装されていましたが、C# 8.0 で完全版になります。 C# 8.0 で追加されるパターンは再帰的なマッチングが可能で、「再帰パターン」(recursive pattern)と呼ばれたりもします。

例えば以下のような感じです(new! と書いている行が再帰パターン)。

public class Point
{
    public int X { get; set; }
    public int Y { get; set; }
    public Point(int x = 0, int y = 0) => (X, Y) = (x, y);
    public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}
 
class Program
{
    static int M(object obj)
        => obj switch
    {
        0 => 1,
        int i => 2,
        Point (1, _) => 4, // new! 位置パターン。
        Point { X: 2, Y: var y } => y, // new! プロパティ パターン。
        _ => 0
    };
}

詳しくは「再帰パターン」で説明します。

switch 式

switchを式として書けるようになりました。 また、従来の switch ステートメントは C# の前身となるC言語のものの名残を強く残し過ぎていて使いにくいものでしたが、その辺りも解消されて使いやすくなりました。

以下のような書き方ができます。

public int Compare(int? x, int? y)
    => (x, y) switch
    {
        (int i, int j) => i.CompareTo(j),
        ({ }, null) => 1,
        (null, { }) => -1,
        (null, null) => 0
    };

後置きの switch キーワードに続けて、{} 内にパターンと返したい値を並べます。

詳しくは「switch」で説明します。

その他

こまごまとした修正がいくつかあります。

null 合体代入 (??=)

C# 8.0 では、null合体演算子 (??)も複合代入に使えるようになりました(??=)。

static void M(string s = null)
{
    s ??= "default string";
    Console.WriteLine(s);
}

詳しくは「null 合体代入 (??=)」で説明します。

@$

C# 7.0 では、文字列リテラル""の前に$@と付けることで、複数行に渡る文字列補間ができましたが、$@の順序は$@しか認められていませんでした。

C# 8.0では@$の順でも認められるようになりました。

更新履歴

ブログ