BT

InfoQ ホームページ ニュース C# 9: パターンマッチングの新キーワード `and`、`or`、`not`

C# 9: パターンマッチングの新キーワード `and`、`or`、`not`

ブックマーク

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

エイプリルフールのジョークのように聞こえるかも知れないが、C# 9では"and"、"or"、"not"がキーワードに加わる予定である。具体的には、パターンマッチングで使用するためだ。

パターンマッチングをより柔軟で強力なものにするため、C#のデザイナたちは、連言(conjunctive)、選言(disjunctive)、否定(negated)パターンの概念を加えたいと考えている。一見するとこれらは、両方のパターンにマッチする(連言)、いずれかのパターンにマッチする(選言)、パターンにマッチしない(否定)、としたい場合の論理演算子のようである。

そこが問題なのだ。Booleanを使用する場合、"&&"と"||"演算子の意味が曖昧になる。それが値なのかパターンなのか、コンパイラが判断できないためだ。説明のため、次のような選言パターンを考えてみよう。

if (myBool is true or false)

これは、"myBoolが真か、あるいはmyBoolが偽の場合に真"と解釈できる。

これを"&&"および"||"演算子をパターンと組み合わせると、次のような構文になる。

if (myBool is true || false)

しかしこの文は、従来から"myBoolが(ture or false)の結果と等しければ真"という意味である。あるいは単純に、"myBoolが真と等しければ真"である。これは、上の選言パターンで得られる結果とはまったく異なっている。

従って、新しい"and"、"or"、"not"キーワードでは、曖昧性を回避する必要がある。これらについては、"Champion "and, or, and not patterns" "に詳しく説明されている。C# 9 feature statusでは、これらはマスタブランチにマージ予定とマークされている。

頻繁に提起される疑問のひとつは、同じ変数を複数回選言することが可能なのか、という点だ。例えば、

if ((e1, e2) is (0, int x) or (int x, 0))
{
    M(x);
}

この理論的な例では、変数xe1またはe2である。これは次のような記述と等価になる。

case (0, int x):
case (int x, 0):
    M(x);

実際に、x確実に設定されるためには、いずれのパターンでもxを宣言する必要がある。しかし、以下のようなコードを使用すると、xyのいずれかには値が設定されない。

if ((e1, e2) is (0, int x) or (int y, 0))
{
    M(x);
    M(y);
}

この問題に対処するために、現在の提案では次のように述べている。

"not"または"or"の直下では、パターン変数を宣言しなくてもよい

この点は、C#の将来バージョンで再検討される可能性がある。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT

あなたのプロファイルは最新ですか?プロフィールを確認してアップデートしてください。

Eメールを変更すると確認のメールが配信されます。

会社名:
役職:
組織規模:
国:
都道府県:
新しいメールアドレスに確認用のメールを送信します。このポップアップ画面は自動的に閉じられます。