我有两个 int 类型的变量? (或 Nullable
有人可以向我解释为什么这是合乎逻辑的,因为 >= 运算符的语义定义包含单词“或”吗?
int?
),那么它们的值 是 已知的。 null
。
Null
),但变量存在的真正问题域实体/值代表未知..
当这个特性最初是在 C# 2.0 中设计的时候,关于这个奇怪的东西就引起了巨大的争论。问题是 C# 用户已经完全习惯了这种意义:
if(someReference == null)
将相等性扩展到可空值类型时,您有以下选择。
可以为空的相等性被真正解除了。如果一个或两个操作数为空,则结果既不是真也不是假,而是空。在这种情况下,您可以: a) 在 if 语句中使用可空值类型相等是非法的,因为 if 语句需要布尔值,而不是可空值布尔值。相反,如果他们想与 null 进行比较,则要求每个人都使用 HasValue。这是冗长和恼人的。 b) 自动将 null 转换为 false。这样做的缺点是,如果 x 为 null,则 x==null 会返回 false,这会造成混淆,并且不利于人们对与引用类型进行 null 比较的理解。可以为空的相等性不会被解除。可空相等是真或假,与空的比较是空检查。这使得可空相等与可空不等式不一致。
这些选择中没有一个显然是正确的;他们都有优点和缺点。例如,VBScript 选择 1b。经过多次辩论,C# 设计团队选择了#2。
因为 Equality 与 Comparability 是分开定义的。
您可以测试 x == null
但 x > null
没有意义。在 C# 中,它总是错误的。
>=
根本就没有定义。
描述'>='的另一种方式是:不小于。没有提到平等。一旦不等式测试中的操作数之一为 Null,结果也是未知的(为 null)。但是,如果您想知道两个操作数是否为 Null,那么 Null == Null 是一个合理的测试(应该结果为真)。摆脱运算符的不等式部分会有所不同。
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
*/
Null == x
是一个例外,它是对 unknown 的显式测试,结果为真或假。
>=
对数值进行运算;哪个 null 不是。
您可以 overload >=
运算符来提供您想要的特定类型的内容。
Nullable<T>
的代码。
NULL 不是零(数字或二进制值)、零长度字符串或空白(字符值)。因此,任何比较运算符都将始终返回 false 。 Read more about it here
null
。此外,C# 可空类型上的比较运算符是一种奇怪的野兽,不一定遵循空比较的通常规则。
您期望什么值?
空==空真
空 >= 空假
空>空假
空 <= 空假
空<空假
空!=空假
== 空假
>= 空假
> 空假
<= 空假
< 空假
!= null true aka !(1 == null)
>= 仅在以特定明确定义的方式使用时表示“大于或等于”。当用于具有重载运算符的类时,它表示类开发人员希望它表示的任何含义。当应用于类似字符串的类时,它可能意味着“排序相同或更高”,也可能意味着“相同长度或更长”。
由于默认情况下 int
不能为 null 并且其值将设置为 0
,因此 > 的运算符和 <它是为 int
类型构建的,期望与 values
一起使用,而不是与 nulls
一起使用。
请参阅我对类似问题的回答,其中我写了一些使用 less <
和 greater >
运算符处理 nullable int
的方法https://stackoverflow.com/a/51507612/7003760
<
、<=
、=>
或>
(其中一个操作数是null
)时该怎么办。在 C# 中,答案是返回false
。在 Scala/JavaString
类中,答案是抛出一个NullPointerException
。