当比较的一边为空时,是否有人具体了解C#如何处理与Nullable<T>
类型的比较?
正如我通过试验编译器所理解的那样,似乎比较总是返回false,但我找不到任何文档来支持它。这是该语言的一个真正特征(因此我可以依赖它),或者这是一个在未来版本中可能会改变的实现细节?
换句话说,以下方法是否返回true暗示y.HasValue
,您是否可以指出一些证明它确实存在的文档?
public bool foo(int x, int? y)
{
return x < y;
}
答案 0 :(得分:46)
当比较的一边为空时,是否有人具体了解C#如何处理与Nullable类型的比较?
是 - C#语言规范,第7.3.7节。在这种情况下,它是一个关系运算符:
对于关系运算符
< > <= >=
,如果操作数类型都是非可空类型且结果类型为bool
,则存在提升形式的运算符。通过向每个操作数类型添加单个?
修饰符来构造提升形式。如果一个或两个操作数为空,则提升的运算符将生成值false
。否则,提升的运算符会解包操作数并应用基础运算符来生成bool
结果。
其他运营商也有类似的详细部分。
如果对该语言的某些方面如何工作(以及它是否有保证或特定于实现)有疑问,那么C#语言规范应该是您的第一个停靠点。
答案 1 :(得分:5)
如果其中一个值为null,则比较将为false(!=
除外)
当您与可空类型进行比较时,如果值为1 可以为空的类型是null,而另一个不是,所有的比较 评估为假,除了!=(不等于)。重要的是不要 假设因为特定比较返回false,所以 相反的情况返回true。在以下示例中,10不是 大于,小于,等于null。只有num1!= num2 评估为真。
答案 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)
我知道我迟到了,但我会把我的两分钱扔进去。
如果存储器服务,则比较器的规则如下:
对于所有非空值:
对于所有意图和目的,Nullable&lt; T&gt;当没有值时,求值为null。因此规则基本相同。至少,这就是我编写比较器的方式。如果我做错了,那么,神圣,我做错了,我当然希望有人告诉我如何解决它!