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

时间:2012-02-29 22:10:28

标签: c# .net

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

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

换句话说,以下方法是否返回true暗示y.HasValue,您是否可以指出一些证明它确实存在的文档?

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

5 个答案:

答案 0 :(得分:46)

  

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

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

  

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

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

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

答案 1 :(得分:5)

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

  

当您与可空类型进行比较时,如果值为1   可以为空的类型是null,而另一个不是,所有的比较   评估为假,除了!=(不等于)。重要的是不要   假设因为特定比较返回false,所以   相反的情况返回true。在以下示例中,10不是   大于,小于,等于null。只有num1!= num2   评估为真。

MSDN Source

答案 2 :(得分:2)

MSDN在此问题上有以下说法:

  

当你对可空类型进行比较时,如果其中一个可空类型的值为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");
}

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

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

  • 如果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&lt; T&gt;当没有值时,求值为null。因此规则基本相同。至少,这就是我编写比较器的方式。如果我做错了,那么,神圣,我做错了,我当然希望有人告诉我如何解决它!