ここで観察される問題は、より一般的な問題の特別なケースです。これは、少なくともいくつかの状況で役立つ可能性のある同等性のさまざまな定義の数が、それらを表現するために一般的に利用可能な手段の数を超えることです。この問題は、同等性をテストするさまざまな方法でさまざまな結果が得られると混乱するという不幸な信念によって悪化する場合があり、このような混乱は、さまざまな形式の同等性が可能な限り同じ結果をもたらすことで回避できる可能性があります。
実際には、混乱の根本的な原因は、異なるセマンティクスが異なる状況で有用であるという事実にもかかわらず、異なる形式の等式および不等式テストが同じ結果をもたらすと期待されるという誤った信念です。たとえば、算術の観点からは、Decimal末尾のゼロの数のみが異なるものを等しいと比較できるようにすると便利です。同様に、double正のゼロや負のゼロなどの値の場合。一方、キャッシングまたはインターンの観点からは、このようなセマンティクスは致命的となる可能性があります。たとえば、Dictionary<Decimal, String>あるmyDict[someDecimal]が等しいであると仮定しsomeDecimal.ToString()ます。このようなオブジェクトは、多くの場合Decimal文字列に変換する必要があり、多くの重複があると予想される値。残念ながら、このようなキャッシングを使用して12.3 mと12.40 mを変換し、その後12.30 mと12.4 mを変換すると、後者の値は「12.30」と「12.4」ではなく「12.3」と「12.40」になります。
手元の問題に戻ると、null許容オブジェクトが等しいかどうかを比較する賢明な方法が複数あります。C#は、その==オペレーターがの動作をミラーリングする必要があるという見方をしていEqualsます。VB.NETは、その動作を望む人なら誰でもEquals使用できるため、その動作は他のいくつかの言語の動作をミラーリングする必要があるという見方をしていますEquals。ある意味で、正しい解決策は3方向の「if」構成を持ち、条件式が3値の結果を返す場合、コードがnullケースで何が起こるかを指定する必要があることです。これは言語そのもののオプションではないため、次善の策は、異なる言語がどのように機能するかを学び、同じでないことを認識することです。
ちなみに、CにはないVisual Basicの「Is」演算子を使用して、null許容オブジェクトが実際にnullかどうかをテストできます。ifテストがを受け入れるかどうかを合理的に疑問に思うかもしれませんが、null許容型で呼び出されたときではなくBoolean?、通常の比較演算子を返すようにすると便利です。ちなみに、VB.NETでは、ではなく等号演算子を使用しようとすると、比較の結果が常にになるという警告が表示され、何かがnullかどうかをテストする場合に使用する必要があります。Boolean?BooleanIsNothingIs