結構久々のSprint進捗報告。

Visual Studio 2017リリース前後の作業が「バグ修正してた」しかなかったので、割かしほんとに久々。 C# 7.1/7.2作業が始まっています。 いくつか紹介。 (ここに並んでいるのが7.1/7.2に入る全てでもないし、優先度の変更もあり得るものです。あくまで、最近作業したもので、現状の予定としてこのバージョンで出したいというもの。)

C# 7.1

default 式

左辺から型推論が効くなら、default(T)(T)の部分を省略可能にするという話。

割と前から実装を初めていて、masterにmerge済み。

async main

やっと、Main メソッドを非同期にできるようになるみたい。実装的には、

  • Mainの戻り値にTaskTask<int>を許す
  • その場合、async修飾子を付けるの必須
  • コード生成で、Main().GetAwaiter().GetResult()を呼ぶだけの繋ぎ用メソッドを生成する

という感じみたい。

Tuple names

タプルでも、匿名型みたいに要素名を自動で付けたいっていう話。 ↓みたいに、変数x, yがあるとき、(x, y)と書けば、タプル要素名を自動的にxにしてほしいという。

tuple names

C# 7.2

一部ビルドできるようにして、CoreFX Labsで使ってもらい始めたみたい。

確かに、時々、Visual Studio 2017付属の普通のC# 7.0コンパイラーではビルドできないコードがあるんですよねぇ、corefxlab。

Span Safety

System.Memoryパッケージ中に入ってるSpan<T>構造体がらみで、ちょっとコンパイラーによる制限を掛けたいっていう話。

Span<T>型は、内部的にスタック上の参照を握っちゃったりするんで、refと同種のコード フロー解析をしないとまずいということみたい。今は妥協的な実装をしているものの、将来的にはByReference<T>とかいう、ほんとに「フィールドとして参照を持てる型」を作って使いたいみたいで、そうなると、Span<T>に対するフロー解析をちゃんとやらないといよいよまずい。

要するに、

  • ref Tと同種の扱いをしないといけない型をref-likeタイプと呼ぶ
  • 条件としては、
    • 参照(ref T)や、一定範囲のメモリ((ref T data, int length))を握っている構造体
    • あるいは、それを入れ子で握っている構造体
  • 掛かる制限としては、ref Tと同じく、

という型。

補足: TypedReference

これ、実のところ、現在のC#でもTypedReferenceっていう「ref Tと同じ扱いしないとまずい型」があったりします。 まあ、隠し(ドキュメント化されていない)機能を使わないと扱えない型なので問題にはなっていませんが。

現状のTypedReferenceは特殊な制約が掛かっていて、やっぱり普通の型のフィールドにできなくなっています。 C# 7.0で参照戻り値が書けるようになったのに対して、TypedReferenceはいまだに戻り値にも使えません。 これも、参照戻り値と同ラインまでは制限を緩めて大丈夫なはずで、ref-like型の一例です。

ref readonly

2月に紹介したやつ。C++でいうconst&。 構造体のコピーを避けるための参照渡しであって、書き換えは認めたくないっていうやつ。 一部、プロトタイプ実装を始めたみたいです。

その先

ちょうど最近Build Insiderの記事書きましたけども、インターフェイスのデフォルト メソッドの実装作業、もう始まっていたりします。 まあ、それなりに時間が掛かる作業なので、今実装が始まっているって言っても、実際のリリースはだいぶ先。

同様に、非null参照がらみもちらほら作業を進めてるみたいです。 (書かれてる作業内容的には、前々から作業してたやつがしばらく塩漬けで、それを久々にmasterブランチと同期したっぽい?)