Koe*_*oen 78 c# comparison nullable operators
我有两个int类型的变量?(或如果你愿意,可以为Nullable <int>).我想对两个变量进行大于或等于(> =)的比较,但事实证明,如果两个变量都为null,则返回false,而显然==运算符返回true.
有人可以向我解释为什么这是合乎逻辑的,因为> =运算符的语义定义包含单词"or"?
Eri*_*ert 96
当该功能最初是在C#2.0中设计时,对这种奇怪性进行了大量争论.问题是C#用户完全习惯这有意义:
if(someReference == null)
Run Code Online (Sandbox Code Playgroud)
将等式扩展为可空值类型时,您有以下选择.
真正解除了可空的平等.如果一个或两个操作数为null,则结果既不是true,也不是false,而是null.在这种情况下,您可以:
a)在if语句中使可空值类型相等是非法的,因为if语句需要bool,而不是可空的bool.相反,HasValue如果他们想要与null进行比较,则需要每个人使用.这是冗长和恼人的.
b)自动将null转换为false.这样做的缺点是,x==null如果x为null,则返回false,这会让人感到困惑并且不利于人们对引用类型的空比较的理解.
可以取消可空的平等.可为空的等式为true或false,与null的比较是空检查.这使得可空的等式与可空的不等式不一致.
这些选择都不是明显正确的; 他们都有利有弊.例如,VBScript选择1b.经过多次辩论,C#设计团队选择了#2.
Hen*_*man 58
因为Equality是与可比性分开定义的.
你可以测试,x == null但x > null没有意义.在C#中,它总是错误的.
Nea*_*alB 11
描述'> ='的另一种方式是:不小于.没有提到平等.一旦非等式测试中的一个操作数为Null,结果也是未知的(为空).但是,如果您想知道两个操作数是否为Null,则Null == Null是一个合理的测试(应该导致为true).摆脱运算符的不等式部分会产生重大影响.
以下代码示例来自http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx#sectionToggle4,总结了C#如何处理Null:
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");
}
/* Output:
* num1 >= num2 returned false (but num1 < num2 also is false)
* num1 < num2 returned false (but num1 >= num2 also is false)
* Finally, num1 != num2 returns true!
* num1 == num2 returns true when the value of each is null
*/
Run Code Online (Sandbox Code Playgroud)