C# 値型の null 比較の予期しない動作
C# では、整数や DateTime などの値型は通常、null を許容できません。つまり、null に割り当てることができません。ただし、場合によっては、C# では、エラーをスローせずに値の型を null と比較できます。
演算子のオーバーロード解決と null 許容型
理由の 1 つは、演算子のオーバーロード解決に関係しています。 C# は演算子のオーバーロードをサポートしているため、開発者はクラスにカスタム演算子を定義できます。等価演算子 (==) については、null 許容値型用に定義された演算子があります。
次のコード スニペットを考えてみましょう:
<code class="language-csharp">Int32 x = 1; if (x == null) { ... }</code>
C# コンパイラーが等価演算子の適切なオーバーロードを見つけたので、このコードはコンパイルされます。 int ローカル変数は null 許容整数 (int?) に暗黙的に変換可能であり、null リテラルも null 許容整数です。したがって、演算子 == は両方の NULL 許容整数に適用できます。
式 (x == null) が常に false と評価される場合でも、それは有効な比較とみなされます。
null 許容型に変換します
もう 1 つの状況は、値の型を null オブジェクト参照と比較しようとする場合です。例:
<code class="language-csharp">object o = null; if (x == o) { ... }</code>
この場合、int 変数 x はオブジェクト型に変換され、null との比較が可能になります。ただし、この比較の結果は常に false になります。
Null 許容構造と条件式
DateTime.Now などの構造体の静的メンバーは、デフォルトで空にすることができます。つまり、null と比較できますが、コンテキストを考慮する必要があります。あなたの例では:
<code class="language-csharp">if (test.ADate == null) { ... }</code>
式 test.ADate は、明示的に null 可能と宣言されていない場合でも、構造体のメンバーであるため、null 可能です。ただし、null との比較は定数式とみなされ、常に false と評価されます。
要約すると、C# では演算子のオーバーロード解決と自動変換のおかげで、値の型を null と比較できます。ただし、値の型を null に割り当てることはできないため、これらの比較の結果は常に false になることを理解することが重要です。
以上がC# では値型の比較が常に False と評価されるにもかかわらず、Null を許可するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。