我把它打进了 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();
有趣的是,如果我创建自己的 struct ( TestStruct
) 并尝试以下操作:
TestStruct t;
(t == null).Dump();
...编译器抱怨我无法在TestSruct
and之间进行相等比较null
。
更新
在评论中,Paolo 指出另一个 StackOverflow 帖子报告了最后一个现象。显然,通过重载==
and!=
运算符,值类型会自动转换为t == null
to (Nullable<TestClass>)t == (Nullable<TestClass>)null
。如果您没有重载这些运算符,则此隐式转换没有意义,因此您会收到错误消息。