結構久々の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の戻り値にTaskとTask<int>を許す- その場合、
async修飾子を付けるの必須 - コード生成で、
Main().GetAwaiter().GetResult()を呼ぶだけの繋ぎ用メソッドを生成する
という感じみたい。
Tuple names
タプルでも、匿名型みたいに要素名を自動で付けたいっていう話。
↓みたいに、変数x, yがあるとき、(x, y)と書けば、タプル要素名を自動的にxにしてほしいという。

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と同じく、-
普通の型のフィールドにできない
ref-like型のフィールドにはできる
- 引数として受け取ったものとか、一部のものしか戻り値として返せない
-
普通の型のフィールドにできない
という型。
補足: TypedReference
これ、実のところ、現在のC#でもTypedReferenceっていう「ref Tと同じ扱いしないとまずい型」があったりします。
まあ、隠し(ドキュメント化されていない)機能を使わないと扱えない型なので問題にはなっていませんが。
現状のTypedReferenceは特殊な制約が掛かっていて、やっぱり普通の型のフィールドにできなくなっています。
C# 7.0で参照戻り値が書けるようになったのに対して、TypedReferenceはいまだに戻り値にも使えません。
これも、参照戻り値と同ラインまでは制限を緩めて大丈夫なはずで、ref-like型の一例です。
ref readonly
2月に紹介したやつ。C++でいうconst&。
構造体のコピーを避けるための参照渡しであって、書き換えは認めたくないっていうやつ。
一部、プロトタイプ実装を始めたみたいです。
その先
ちょうど最近Build Insiderの記事書きましたけども、インターフェイスのデフォルト メソッドの実装作業、もう始まっていたりします。 まあ、それなりに時間が掛かる作業なので、今実装が始まっているって言っても、実際のリリースはだいぶ先。
同様に、非null参照がらみもちらほら作業を進めてるみたいです。 (書かれてる作業内容的には、前々から作業してたやつがしばらく塩漬けで、それを久々にmasterブランチと同期したっぽい?)
