请考虑以下代码:
DateTime t = DateTime.Today;
bool isGreater = t > null;
使用Visual Studio 2010(C#4,.NET 4.0),我收到以下警告:
警告CS0458:表达式的结果始终为'bool'类型的'null'
这是不正确的;结果总是如此 false
(类型 bool
):
现在,结构DateTime重载了 >
(大于)运算符。任何不可为空的结构(如DateTime)都可以隐式转换为相应的结构 Nullable<>
类型。上面的表达式完全相同
bool isGreater = (DateTime?)t > (DateTime?)null;
这也产生了同样的错误警告。在这里 >
运营商是 取消 运营商。这通过返回false if来工作 HasValue
它的任何两个操作数都是 false
。否则,提升的运算符将继续将两个操作数展开到底层结构,然后调用重载 >
由该结构定义(但在这种情况下,这不是必需的,其中一个操作数不是 HasValue
)。
你能重现这个bug吗?这个bug是众所周知的吗?我误解了什么吗?
对于所有结构类型(不是简单类型)都是一样的 int
,而不是枚举类型),使有问题的运算符超载。
(现在,如果我们使用 ==
代替 >
,一切都应该完全相似(因为DateTime也会超载 ==
运营商)。但它并不相似。如果我说
DateTime t = DateTime.Today;
bool isEqual = t == null;
我明白了 没有 警告有时您会看到人们意外地检查变量或参数是否为null,而没有意识到他们的变量类型是一个结构(超载 ==
这不是一个简单的类型 int
)。如果他们得到警告会更好。)
更新: 使用C#6.0编译器(基于 罗斯林)Visual Studio 2015,错误的消息 isGreater
以上内容已更改为CS0464,并带有正确且有用的警告消息。另外,缺乏警告 isEqual
上面是在VS2015的编译器中修复的,但只有在编译时才有 /features:strict
。