可为null的类型如何使用比较运算符处理null值

本文关键字:null 运算符 处理 比较 类型 可为 何使用 | 更新日期: 2023-09-27 18:26:07

当比较的一侧为空时,有人知道C#如何处理与Nullable<T>类型的比较的具体信息吗?

正如我从编译器的实验中了解到的那样,比较似乎总是返回false,但我找不到任何文档来支持这一点。这是该语言的一个真正功能(因此我可以信赖),还是在未来版本中可能会更改的实现细节?

换言之,以下返回true的方法是否意味着y.HasValue,你能给我指一些证明它是这样的文档吗?

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

可为null的类型如何使用比较运算符处理null值

当比较的一侧为null时,是否有人知道C#如何处理与Nullable类型的比较的具体信息?

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

对于关系运算符< > <= >=,如果操作数类型都是不可为null的类型并且结果类型是bool,则存在运算符的提升形式。提升形式是通过向每个操作数类型添加一个?修饰符来构造的。如果一个或两个操作数都为空,则提升运算符产生值false。否则,提升运算符将展开操作数,并应用底层运算符以产生bool结果。

其他操作员也有类似的详细章节。

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

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

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

MSDN源

MSDN对此有以下看法:

与可为null的类型执行比较时,如果其中一个可为null类型的值为null,而另一个不为null,则除!=(不平等)。"

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(对象)的链接,它详细说明了比较int和对象的结果的原因。

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

我找不到任何确定的东西,但我没有看到任何迹象表明.NET框架被扩展为包括用于每个<T>System.Nullable<T>的CompareTo方法。

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

我知道我迟到了,但我会投入我的两分钱。

如果内存可用,比较器的规则如下:

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

对于所有非零值:

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

就所有意图和目的而言,Nullable<T>当它没有值时计算为null。因此,规则本质上是相同的。至少,这就是我写比较器的方式。如果我做错了,那么,神圣的上帝,我做错了。我当然希望有人告诉我如何修复它!!