== が null 値に対して true を返すのに、>= が false を返すのはなぜですか? 質問する

== が null 値に対して true を返すのに、>= が false を返すのはなぜですか? 質問する

int? (または Nullable<int>) 型の変数が 2 つあります。2 つの変数に対して、より大きいか等しい (>=) 比較を実行したいのですが、両方の変数が null の場合は false が返されますが、== 演算子は明らかに true を返します。

>= 演算子の意味定義に「または」という単語が含まれているのに、なぜそれが論理的であるかを誰か説明してもらえますか?

ベストアンサー1

この機能が C# 2.0 で最初に設計されたとき、この奇妙さについて大きな議論がありました。問題は、C# ユーザーがこれが意味のあるものであることに完全に慣れていることです。

if(someReference == null)

等価性を null 許容値型に拡張する場合、次の選択肢があります。

  1. ヌル許容等価性は本当に持ち上げられたオペランドの 1 つまたは両方が null の場合、結果は true でも false でもなく null になります。この場合、次のいずれかを実行できます。

    • a) ステートメントで null 許容値型の等価性を持つことを違法にします。ステートメントには、null 許容 bool ではなく bool が必要なifためです。代わりに、 null と比較したい場合には、すべてのユーザーが を使用する必要があります。これは冗長でイライラします。ifHasValue

    • b) 自動的に null を false に変換します。この方法の欠点は、x==nullx が null の場合に false を返すことです。これは混乱を招き、参照型との null 比較に対するユーザーの理解に反します。

  2. Null 許容等価性は解除されません。Null 許容等価性は true または false のいずれかであり、null との比較は null チェックです。これにより、Null 許容等価性は Null 許容不等価性と矛盾します。

これらの選択はどれも明らかに正しいわけではなく、すべてに長所と短所があります。たとえば、VBScript は 1b を選択します。多くの議論の末、C# 設計チームは #2 を選択しました。

おすすめ記事