滅入るんるん

何か書きます

C# 8.0に追加されそうな小さな機能候補

今週はネタに困ったのでcharplangでC# 8.0に追加されそうな小さな機能でも紹介しようと思います。
ちなみに、C# 8.0で追加されそうな機能の一覧はここで見れます。

Champion "Null-coalescing assignments"

日本語で直訳するとNull合体割り当てですが、意味的にはNull合体代入という感じでしょうか。
int? x = null;
// 提案されている構文
x ??= 10;
// 既存のコードにするとこうなる
x = (x ?? 10);

??の仲間を増やそう見たいな感じです(てきとう)。ただ、あったら便利だけどなくてもいいような感じがする品物。

objectValue?.x = 10;

個人的には上のような構文があったらいいなとは思いますが、もちろん提案はされています(採用されるとは言っていない)。

Champion "Negated-condition if statement"

否定条件if文です。Swiftならguard、Rubyならunlessでしょうかね。
こちらはかなり議論が紛糾しています。否定条件バージョンのif文の追加ぐらいすぐできるのでは?言語設計が悪いの?と思われるかもしれませんが、むしろその逆で言語設計がいいから議論が紛糾しているとも言えます。
それで議論が紛糾している原因ですが、C#で機能追加が行われる場合、既存のコードとの互換性も考慮に入れなければいけませんが、guardやunlessなどの構文を追加してしまうと、既存のコードでそのような名前のメソッドが定義されていたりすると、キーワードと衝突する問題が発生します。(あらかじめ予約語としてとっておけばこんなこともなかったですが)。
現在提案されている構文はif文の拡張みたいな感じで収まっていたりします。
if !(x == 1){}
if not(x == 1){}

どうなるか楽しみではありますが、private protectedみたいに延期される気配も感じますね。

C# 8.0では非Null許容参照型の導入で破壊的な変更も加えられる予定なので、この際unlessのような予約語を追加してもいい気はします。

Champion "Null-conditional await"

日本語ではNull条件付きawaitってところでしょうか。
// 提案
await? SomeMethodAsync();
// 既存のコードにするとこんな感じ
var task = SomeMethodAsync();
if(task !=null) await task;

awaitにNullの場合の糖衣構文をつけてやるものですね。非Null許容参照型と組み合わせて使うものでしょうか、C# 7.2環境ではあまり使いどころがあるように見えませんね。

おわりに

今回の紹介はここまでにします。他にもSmallish Featureラベルが付けられている提案はあるのですが、読んでてもよくわからなかったので(流し読みのせい)。
C#に盛り込まれるかもしれない提案を眺めるのはC#erとして何かワクワクするようなものを感じたりするので、皆さんもcsharplang眺めてみてはどうでしょうか。全部英語だけど(小声)