BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース C# 9: Swicth文の範囲演算子とパターンマッチング式

C# 9: Swicth文の範囲演算子とパターンマッチング式

ブックマーク

原文(投稿日:2020/07/17)へのリンク

C#が初めて紹介された頃から、開発者たちは、この言語のswitch文に範囲演算子(range operator)のないことに不満を唱えていた。このためにC#のswitchは、VBよりもはるかに使い勝手が悪かったのだ。C# 9では、パターンマッチング拡張の一部として、この制限への対処が行われている。

この機能では、"case"または"is"キーワードに続いて、次のようなパターンの使用が可能になる。

  • < 定数式
  • 定数式
  • <= 定数式
  • >= 定数式

定数のみが使用可能という意味では、これでもまだVBより制限が多い。日付や時刻などの比較が可能な構造体を使用する場合、C#ではそれらを定数として表現できないため、これが問題になる。(VBでは日付/時刻の値を定数として記述できるが、DateTime.Kindの問題があるため推奨されていない。) その理由を問われたNeal Gafter氏が記している

パターンマッチングが設計の前提とした動作は、それとは違います。具体的には、コンパイラが一連のパターンマッチング処理を解析し、診断し、全体的に最適化できるようにするために、特に定数を使うように設計されているのです。マッチングの対象となる値をコンパイラが分からなければ、そういったことは何もできません。必ずしも間違ったアイデアだとは言いませんが、まったくの別物なのです。その目的ならば、通常の式で十分ではないですか?

一方で、Mariusz Pawelski氏は、これが問題になる理由を次のように説明している。

論理式(boolean expression)を書くときとは違う方法で、"is"や"or"といったキーワードを使いたい、と考えている人はたくさんいるのではないかと思うのです。C#のちょっとした機能で、コードがずっと簡潔になります。ここ数年で私たちが手にした、山のような機能(式形式のメンバ、out変数、タプル、null条件演算子、"default"リテラルなど)に匹敵します。"定数式で動作するように設計"された"パターンマッチング"のような優れた機能の一部なのだ、と言われても、それは開発者の知るところではありません。定数の代わりに変数名を使って、"CS0150: 定数値が必要です"というエラーが出れば、困惑するだけです。

以前の記事で我々は、"and"、"not"、"or"パターンマッチ演算子について論じた。これらの演算子は、範囲(range)と合わせて使用することができる。例えば、

bool IsLetter(char c) => c is >= 'a' and <= 'z' or >= 'A' and <= 'Z';

確かにこれは、少し読みにくい。そこでC# 9では、他の型による式と同じように、パターンをカッコで囲んで明示的に優先順位を示すことができるようになっている。

bool IsLetter(char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');

"C# 9 feature status"によると、これらの機能はマスタブランチへのマージ対象としてマークされている。

改訂: このレポートの以前のバージョンでは"to"演算子が含まれていたが、C# 9の現在の計画には、この機能は含まれていないという情報を得ている。

この記事に星をつける

おすすめ度
スタイル

BT