在VB.NET发生这种情况:
Dim x As System.Nullable(Of Decimal) = Nothing
Dim y As System.Nullable(Of Decimal) = Nothing
y = 5
If x <> y Then
Console.WriteLine("true")
Else
Console.WriteLine("false") '' <-- I got this. Why?
End If
但在 C# 中会发生这种情况:
decimal? x = default(decimal?);
decimal? y = default(decimal?);
y = 5;
if (x != y)
{
Debug.WriteLine("true"); // <-- I got this -- I'm with you, C# :)
}
else
{
Debug.WriteLine("false");
}
为什么会有差异?
最佳答案
VB.NET 和 C#.NET 是不同的语言,由对使用做出不同假设的不同团队构建;在这种情况下,NULL 比较的语义。
我个人偏爱 VB.NET 语义,它实质上为 NULL 提供了“我还不知道”的语义。然后将 5 与“我还不知道”进行比较。自然是“我还不知道”;即空。这具有镜像 NULL 在(如果不是全部)SQL 数据库中的行为的额外优势。这也是对三值逻辑的更标准(比 C# 的)解释,如 here 所述。 .
C# 团队对 NULL 的含义做出了不同的假设,从而导致您表现出的行为差异。 Eric Lippert wrote a blog about the meaning of NULL in C# . Per Eric Lippert:“我还在 VB/VBScript 和 JScript here 和 here 中写了空值的语义”。
在任何可能出现 NULL 值的环境中,重要的是要认识到不再依赖排中律(即 A 或 ~A 重言式为真)。
更新:
A bool
(与 bool?
相对)只能取值 TRUE 和 FALSE。然而,NULL 的语言实现必须决定 NULL 如何通过表达式传播。在 VB 中,表达式 5=null
和 5<>null
两者都返回假。在 C# 中,可比较的表达式 5==null
和 5!=null
只有 second first [updated 2014-03-02 - PG] 返回 false。然而,在任何支持 null 的环境中,程序员都有责任了解该语言使用的真值表和 null 传播。
更新
Eric Lippert 关于语义的博客文章(在他下面的评论中提到)现在位于:
关于c# - 为什么在 VB.NET 和 C# 中根据值检查 null 会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15524045/