Tag: 提升运算符

将struct与null进行比较时,编译器警告错误

请考虑以下代码: DateTime t = DateTime.Today; bool isGreater = t > null; 使用Visual Studio 2010(C#4,.NET 4.0),我收到以下警告: 警告CS0458:表达式的结果始终为’bool’类型的’null’ 这是不正确的; 结果始终为false (类型为bool ): 现在,struct DateTime重载了> (大于)运算符。 任何不可为空的结构(如DateTime)都可以隐式转换为相应的Nullable类型。 上面的表达式完全相同 bool isGreater = (DateTime?)t > (DateTime?)null; 这也产生了同样的错误警告。 这里>运算符是提升运算符。 如果其两个操作数中的任何一个的HasValue为false,则返回false 。 否则,提升的运算符将继续将两个操作数展开到底层结构,然后调用该结构定义的>的重载(但在这种情况下,如果一个操作数不是HasValue则不需要)。 你能重现这个bug吗?这个bug是众所周知的吗? 我误解了什么吗? 这对于所有结构类型(不是像int这样的简单类型,而不是枚举类型)都是相同的,它会使运算符重载。 (现在如果我们使用==而不是> ,一切都应该完全相似(因为DateTime也会重载==运算符)。但它不相似。如果我说 DateTime t = DateTime.Today; bool isEqual = t == null; 我没有得到警告☹有时你会看到人们不小心检查变量或参数为null,没有意识到他们的变量类型是一个结构(它重载==而不是像int这样的简单类型)。 如果他们得到警告会更好。) 更新:使用Visual Studio […]