请问C#可以将值类型与NULL进行比较

C#可以将值类型与NULL进行比较

我今天遇到了这种情况,不知道为什么C#编译器没有抛出错误。

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

我搞不懂x怎么可能是空的。特别是由于此赋值肯定会引发编译器错误:

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?");
        }
    }}


慕妹3242003
浏览 590回答 3
3回答

慕慕森

这是合法的,因为操作符重载解析有唯一的最佳运算符可供选择。有一个=操作符,它接受两个可空的INT。int local可转换为可空int。空文本可转换为可空的int。因此,这是=操作符的合法用法,并且总是导致false。同样,我们还允许您说“if(x=12.6)”,这也总是false。INT局部可转换为双,文字可转换为双,显然它们永远不会相等。

慕婉清6462132

这不是一个错误,因为有一个(int?)转换;它确实在给出的示例中生成警告:表达式的结果总是‘false’,因为‘int’类型的值永远不等于‘int’类型的‘null’?如果你检查IL,你会发现完全地移除无法到达的分支-它在发布版本中不存在。不过,请注意不为带有相等运算符的自定义结构生成此警告。它曾用于2.0,但在3.0编译器中则不然。代码仍然被删除(因此它知道代码是不可访问的),但是不会生成警告:using System;struct MyValue{     private readonly int value;     public MyValue(int value) { this.value = value; }     public static bool operator ==(MyValue x, MyValue y) {         return x.value == y.value;     }     public static bool operator !=(MyValue x, MyValue y) {         return x.value != y.value;     }}class Program{     static void Main()     {         int i = 1;         MyValue v = new MyValue(1);         if (i == null) { Console.WriteLine("a"); } // warning         if (v == null) { Console.WriteLine("a"); } // no warning     }}与IL(用于Main)-注一切除了MyValue(1)(可能有副作用)已被移除:.method private hidebysig static void Main() cil managed{     .entrypoint    .maxstack 2     .locals init (         [0] int32 i,         [1] valuetype MyValue v)     L_0000: ldc.i4.1      L_0001: stloc.0      L_0002: ldloca.s v     L_0004: ldc.i4.1      L_0005: call instance void MyValue::.ctor(int32)     L_000a: ret  }这基本上是:private static void Main(){     MyValue v = new MyValue(1);}

青春有我

不,Int32 x永远不会变成null.如果您将一个int与NULL进行比较,那么使用两个int?s的比较操作符是适用的。“为什么将值类型与空值进行比较是一种警告?”文章会对你有帮助的。
打开App,查看更多内容
随时随地看视频慕课网APP