C#visual studio编译器如何处理struct/NULL比较

本文关键字:struct NULL 比较 处理 编译器 studio 何处理 C#visual | 更新日期: 2023-09-27 18:25:34

我们刚刚在我们的c#.net 4代码库中遇到了一些像这样的坏代码

DateTime myDate = someValue;
If (myDate==Null)
    Do Something

我们突然想到这种情况永远不会发生。

编译器如何处理这些不可为null的结构比较?

最初我们很惊讶它会编译。。。但合理化了它,因为你肯定可以有一个恒定的比较,比如:

If(1==2)

这也永远不会解决真正的。。。但在这种情况下,编译器可以很容易地判断出它们是常量。它是否优化或汇总了不可为null的比较?

C#visual studio编译器如何处理struct/NULL比较

我在LinqPad:中打了这个

var t = new DateTime();
t.Dump();
(t == null).Dump();

得到了这个:

IL_0000:  ldloca.s    00 
IL_0002:  initobj     System.DateTime
IL_0008:  ldloc.0     
IL_0009:  call        LINQPad.Extensions.Dump
IL_000E:  pop         
IL_000F:  ldc.i4.0    
IL_0010:  call        LINQPad.Extensions.Dump

因此,是的,编译器将其编译为:

var t = new DateTime();
t.Dump();
(false).Dump();

有趣的是,如果我创建自己的结构(TestStruct)并尝试以下操作:

TestStruct t;
(t == null).Dump();

编译器抱怨我不能在CCD_ 2和CCD_。

更新

在一篇评论中,Paolo指出另一篇StackOverflow的帖子报道了最后一个现象。显然,通过重载==!=运算符,值类型将自动从t == null转换为(Nullable<TestClass>)t == (Nullable<TestClass>)null。如果您没有重载这些运算符,那么这种隐式转换就没有意义,所以您会得到一个错误。