rksoftware

Visual Studio とか C# とかが好きです

C# 9.0 の確認「ラムダ ディスカード パラメーター」

C# 9.0 の確認の目次はこちら

■ ラムダ ディスカード パラメーター

ドキュメントはこちら

適合性と完成度の機能 という項目の割と読み進めた所の 「次に、ラムダ式に対するパラメーターと」 から始まるブロックです。
見出しのカタカナ「ラムダ ディスカード パラメーター」にとてつもないパワーを感じますが、これはとてもうれしい機能です。ぜひ使いこなしましょう!

■ 検証コードと結果

■ 以前のコード

例えば次のような Linq を使ったコードがあったとします。

new int[0].Select((element, index) => 0);

こんなコードを書くことはないかもしれませんが例なので我慢してください。ここで elementindex は使用しないのに名前をつけなければなりません。

名前をつけないので _ としてしまいたいところですが、残念ながら次のコードはこれまでエラーになっていました。

new int[0].Select((_, _) => 0);

エラーになる箇所は二つ目の _ エラーメッセージは

機能 'ラムダ ディスカード パラメーター' は C# 8.0 では使用できません。言語バージョン 9.0 以上を使用してください。

です。

余談ですが、_ は変数名として有効な名前なので次のコードは有効な C# コードでした。

new int[0].Select((_, index) => _);

■ C# 9 では

C# 9 では次のコードは有効な C# コードです。

new int[0].Select((_, _) => 0);

これにより使わない変数すべてを _ と書けるのでとてもすっきりします。うれしいですね。

■ 以前のコードは?

となると気になるのは、以前有効だった次のようなコードです。

new int[0].Select((_, index) => _);

これも大丈夫です。C# 9 でも問題なく書けています。

そうするとまた気になるのは _ を複数書いたときにそれは変数としてどうなるの? というところです。その答えはドキュメントのリンクを何個かたどると書いてありますが、変数として _ を使おうとするコードはエラーとなります。

次のコードはエラーになります。

new int[0].Select((_, _) => _);

エラーの箇所は、三つ目の _ でエラーメッセージは次のような CS0103 エラーが出て使えません。

現在のコンテキストに '_' という名前は存在しません  

ドキュメントによるとコンパイラ エラー CS0301 となっているので、そちらが出る書き方もあると思います。

■ まとめ

使わない変数をどんどん _ にすることができるようになっています。コードは簡潔でわかりやすくなります。完全に理解して積極的に使いこなしましょう。