在
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(在大多数情况下如果不是全部)sql数据库的行为的额外优点。这也是一个更标准的(比C#的)三值逻辑的解释,如解释here。
C#团队对NULL意味着什么不同的假设,导致您显示的行为差异。 Per Eric Lippert:“我还写了关于VB / VBScript和JScript here和here中null的语义。
在任何可能存在NULL值的环境中,认识到排除中间的法律(即A或〜A是互为真实的)不再能被依赖是不言而喻的。
更新:
bool(而不是bool?)只能取值TRUE和FALSE。然而,NULL的语言实现必须决定NULL如何通过表达式传播。在VB中,表达式5 = null和5<> null BOTH返回false。在C#中,比较表达式5 == null和5!= null只有第二个[返回false]。但是,在支持null的任何环境中,程序员都有义务知道该语言使用的真值表和null传播。