ホームページ >バックエンド開発 >C++ >C# では値型の比較が常に False と評価されるにもかかわらず、Null を許可するのはなぜですか?

C# では値型の比較が常に False と評価されるにもかかわらず、Null を許可するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-16 18:30:10901ブラウズ

Why Does C# Allow Value Type Comparisons to Null, Even Though They Always Evaluate to False?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。