为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
江户川乱折腾 2019-07-17 16:13:59
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?");         }     }}
查看完整描述

3 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

这是合法的,因为操作符重载解析有唯一的最佳运算符可供选择。有一个=操作符,它接受两个可空的INT。int local可转换为可空int。空文本可转换为可空的int。因此,这是=操作符的合法用法,并且总是导致false。

同样,我们还允许您说“if(x=12.6)”,这也总是false。INT局部可转换为双,文字可转换为双,显然它们永远不会相等。


查看完整回答
反对 回复 2019-07-17
?
慕的地10843

TA贡献1785条经验 获得超8个赞

这不是一个错误,因为有一个(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);}


查看完整回答
反对 回复 2019-07-17
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

不,Int32 x永远不会变成null.

如果您将一个int与NULL进行比较,那么使用两个int?s的比较操作符是适用的。


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 1400 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信