これは特に興味深い質問だと思います。私は、どの回答ともまったく同じではないことを理解しています。
最初に注意すべきことは、.NET は他のコンテキストnull
と完全に同じではありませんが、それらをモデル化するために使用できるということです。null
たとえば SQL では、1 = null
と1 <> null
両方の returnがあるかもしれません。これは、null が null を含む何とも等しくないという数学的なnull
概念に近いためですが、正確には何とも等しくないわけでもありません。null
必要に応じてこれにC# を使用することもできますが、.NETnull
での既定の意味は完全には機能しません。null
どの参照型でも、null には特定の定義済みの意味があり、場合によってはコンテキストによって追加の意味が提供されます。
具体的な意味は、「このタイプのオブジェクトのインスタンスはありません」です。
特定のコンテキストでの追加の意味は、「整数値は、任意の整数に一致するのではなく、実際には null である」、または「そのようなアイテムのコレクションはなく、空のコレクションでもありません」、または「これは最初のそのようなアイテムです。だから前者はいない」など、使い方次第です。(また、「ああ、それは実際にはnullになるはずがなかったので、例外をスローしたほうがよい」という意味になる可能性があります)。
ここで、オブジェクトが null と等しい、または少なくとも null と等しくないことが意味のあるケースを定義する程度まで、これらの追加の意味を多用したいと思うかもしれません。ただし、次の制限があります。
参照型の値に対して null という特定の定義は、その参照型のインスタンスが存在しないことを意味します。
与えられた x と y に対してx == y
常に反対の結果をもたらすセマンティクスはなくなることはありません。x != y
したがって:
インスタンスが null に等しい型が必要な場合は、値型である必要があります。
とx != null
は逆に返す必要がありx == null
ます。
さて、.NET 2.0 以降、まさにそれを行うビルトインがあります: Nullable<T>
(またはT?
C# 構文で)。また、ボクシングに直面しても適切に動作するように、少し追加のサポートがあります (これにより、人間の方法で参照型のように動作するようになります。そのため、追加のサポートがx == null
なければ、true が(object)x == null
返されても false が返されるという複雑な問題が発生します。
またNullable<T>
、null に対してこの種のわずかに異なるセマンティクスを使用したいほとんどすべてのケースに対処できるケースでもあります。Equals()
null を渡すと true を返すメソッド。