1. ホーム
  2. c#

[解決済み] C#は値の型をNULLと比較しても問題ない

2023-05-09 10:33:32

質問

今日、この問題に遭遇したのですが、なぜ C# コンパイラがエラーを投げないのか見当もつきません。

Int32 x = 1;
if (x == null)
{
    Console.WriteLine("What the?");
}

xがNULLになる可能性があるのか、混乱しています。特に、この代入は間違いなくコンパイラーエラーを投げるので。

Int32 x = null;

x が null になる可能性はありますか。マイクロソフトがこのチェックをコンパイラに入れないことにしたのでしょうか、それとも完全に見逃してしまったのでしょうか。

更新: この記事を書くためにコードをいじった後、突然、コンパイラは式が決して真にならないという警告を表示するようになりました。今、私は本当に迷っています。私はオブジェクトをクラスに入れ、今では警告はなくなりましたが、値型が null で終わることができるのかという疑問が残りました。

public class Test
{
    public DateTime ADate = DateTime.Now;

    public Test ()
    {
        Test test = new Test();
        if (test.ADate == null)
        {
            Console.WriteLine("What the?");
        }
    }
}

どのように解決するのですか?

演算子のオーバーロード解決には、選択すべき最適な演算子が一意であるため、これは合法です。2 つの nullable int を取る == 演算子があります。int ローカルは null 可能な int に変換されます。null リテラルは nullable int に変換可能です。したがって、これは == 演算子の合法的な使用法であり、常に false という結果になります。

同様に、"if (x == 12.6)" と言うことも許可されており、これも常に false になります。int ローカルは double に変換可能で、リテラルは double に変換可能で、明らかにこれらは決して等しくはなりません。