int? (または Nullable<int>) 型の変数が 2 つあります。2 つの変数に対して、より大きいか等しい (>=) 比較を実行したいのですが、両方の変数が null の場合は false が返されますが、== 演算子は明らかに true を返します。
>= 演算子の意味定義に「または」という単語が含まれているのに、なぜそれが論理的であるかを誰か説明してもらえますか?
ベストアンサー1
この機能が C# 2.0 で最初に設計されたとき、この奇妙さについて大きな議論がありました。問題は、C# ユーザーがこれが意味のあるものであることに完全に慣れていることです。
if(someReference == null)
等価性を null 許容値型に拡張する場合、次の選択肢があります。
ヌル許容等価性は本当に持ち上げられたオペランドの 1 つまたは両方が null の場合、結果は true でも false でもなく null になります。この場合、次のいずれかを実行できます。
a) ステートメントで null 許容値型の等価性を持つことを違法にします。ステートメントには、null 許容 bool ではなく bool が必要な
if
ためです。代わりに、 null と比較したい場合には、すべてのユーザーが を使用する必要があります。これは冗長でイライラします。if
HasValue
b) 自動的に null を false に変換します。この方法の欠点は、
x==null
x が null の場合に false を返すことです。これは混乱を招き、参照型との null 比較に対するユーザーの理解に反します。
Null 許容等価性は解除されません。Null 許容等価性は true または false のいずれかであり、null との比較は null チェックです。これにより、Null 許容等価性は Null 許容不等価性と矛盾します。
これらの選択はどれも明らかに正しいわけではなく、すべてに長所と短所があります。たとえば、VBScript は 1b を選択します。多くの議論の末、C# 設計チームは #2 を選択しました。