c# - 为什么在 VB.NET 和 C# 中根据值检查 null 会有所不同?

标签 c# vb.net .net-4.0 null

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 herehere 中写了空值的语义”。

在任何可能出现 NULL 值的环境中,重要的是要认识到不再依赖排中律(即 A 或 ~A 重言式为真)。

更新:

A bool (与 bool? 相对)只能取值 TRUE 和 FALSE。然而,NULL 的语言实现必须决定 NULL 如何通过表达式传播。在 VB 中,表达式 5=null5<>null两者都返回假。在 C# 中,可比较的表达式 5==null5!=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/

相关文章:

c# - 动画、Image.Source 和绑定(bind)

c# - 在 C++ 中将一个接口(interface)指针分配给另一个接口(interface)指针

从非托管 C 调用托管代码

c# - 为什么第一个 linq 的执行速度比第二个快 20 倍 [获取最大值]

c# - Ria 服务将复杂对象作为参数传递给查询域服务方法

c# - 正则表达式以匹配电子邮件

vb.net - 在循环中添加多个 OrderBy 语句的 Linq 查询

c# - wpf c# DispatcherUnhandledException 未触发

c# - Page.IsValid 检查内部结构?

c# - LoaderOptimizationAttribute 的作用