可空类型如何使用比较运算符处理空值?

当比较的一边为空时,有没有人具体了解C#如何处理与Nullable类型的比较?

正如我通过试验编译器所理解的那样,似乎比较总是返回false,但我找不到任何文档来支持它。 这是该语言的真正特征(因此我可以依赖它),或者这是一个可能在未来版本中发生变化的实现细节?

换句话说,以下方法返回true是否意味着y.HasValue ,你能指出一些certificate它确实存在的文档吗?

  public bool foo(int x, int? y) { return x < y; } 

当比较的一边为空时,有没有人具体了解C#如何处理与Nullable类型的比较?

是 – C#语言规范,第7.3.7节。 在这种情况下,它是一个关系运算符:

对于关系运算符< > <= >=如果操作数类型都是非可空类型且结果类型是bool ,则存在运算符的提升forms。 提升forms是通过添加一个? 每个操作数类型的修饰符。 如果一个或两个操作数为空,则提升的运算符将生成值false 。 否则,提升的运算符解包操作数并应用基础运算符以产生bool结果。

其他运营商也有类似的详细部分。

如果对该语言的某些方面如何工作(以及它是否有保证或特定于实现)存在疑问,那么C#语言规范应该是您的第一个调用端口。

如果其中一个值为null,则比较将为false(除了!=

当您使用可空类型进行比较时,如果其中一个可空类型的值为null而另一个不为null,则除了!=(不等于)之外,所有比较都会计算为false。 重要的是不要假设因为特定比较返回false,相反的情况返回true。 在以下示例中,10不大于,小于,也不等于null。 只有num1!= num2的计算结果为true。

MSDN来源

MSDN对此事有以下说法:

当您使用可空类型进行比较时,如果其中一个可空类型的值为null而另一个不为null,则除了!=(不等于)之外,所有比较都会计算为false。

http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx

以下是提供的代码示例:

 int? num1 = 10; int? num2 = null; if (num1 >= num2) { Console.WriteLine("num1 is greater than or equal to num2"); } else { // This clause is selected, but num1 is not less than num2. Console.WriteLine("num1 >= num2 returned false (but num1 < num2 also is false)"); } if (num1 < num2) { Console.WriteLine("num1 is less than num2"); } else { // The else clause is selected again, but num1 is not greater than // or equal to num2. Console.WriteLine("num1 < num2 returned false (but num1 >= num2 also is false)"); } if (num1 != num2) { // This comparison is true, num1 and num2 are not equal. Console.WriteLine("Finally, num1 != num2 returns true!"); } // Change the value of num1, so that both num1 and num2 are null. num1 = null; if (num1 == num2) { // The equality comparison returns true when both operands are null. Console.WriteLine("num1 == num2 returns true when the value of each is null"); } 

如果没有实现特定的CompareTo,那么我的研究告诉我该对象将使用CompareTo(对象)。 对于int,您可以与int或对象进行比较。 在这种情况下,它只检查对象是否为null。 这是一个指向int CompareTo(object)的链接,它详细说明了比较int和object的结果的原因。

http://msdn.microsoft.com/en-us/library/system.int32.aspx

我找不到任何确定的东西,但我没有看到任何表明.NET框架已扩展为包含每个System.Nullable的CompareTo方法的内容。

如果它是我的代码,我会保护自己并扩展Int类以包含CompareTo。

我知道我迟到了,但我会把我的两分钱扔进去。

如果内存服务,比较器的规则如下:

  • 如果x和y为null,则返回0(它们相等)。
  • 如果x为null,而y不为,则返回-1(x小于y)。
  • 如果x不为null,并且y为null,则返回1(x大于y)。

对于所有非空值:

  • 当x的值计算小于y时,返回-1。
  • 当x的值计算y时,返回0。
  • 当x的值计算为大于y时,返回1。

对于所有意图和目的,Nullable 在没有值时计算为null。 因此规则基本相同。 至少,这就是我写比较器的方式。 如果我做错了,那么,圣洁的神,我做错了,我当然希望有人告诉我如何解决它!