如果变量值为Nothing,我们遇到了null条件运算符的意外行为。
以下代码的行为让我们感到有些困惑
Dim l As List(Of Object) = MethodThatReturnsNothingInSomeCases()
If Not l?.Any() Then
'do something
End If
如果Not l?.Any()
没有条目或l
为Nothing,则预期的行为是l
是真实的。但如果l
为Nothing则结果是假的。
这是我们用来查看实际行为的测试代码。
Imports System
Imports System.Collections.Generic
Imports System.Linq
Public Module Module1
Public Sub Main()
If Nothing Then
Console.WriteLine("Nothing is truthy")
ELSE
Console.WriteLine("Nothing is falsy")
End If
If Not Nothing Then
Console.WriteLine("Not Nothing is truthy")
ELSE
Console.WriteLine("Not Nothing is falsy")
End If
Dim l As List(Of Object)
If l?.Any() Then
Console.WriteLine("Nothing?.Any() is truthy")
ELSE
Console.WriteLine("Nothing?.Any() is falsy")
End If
If Not l?.Any() Then
Console.WriteLine("Not Nothing?.Any() is truthy")
ELSE
Console.WriteLine("Not Nothing?.Any() is falsy")
End If
End Sub
End Module
结果:
为什么不是最后一个评估为真?
C#阻止我完全写这种支票......
答案 0 :(得分:5)
在VB.NET中Nothing
不等于或等于其他任何东西(类似于SQL),而不是C#。因此,如果您将Boolean
与没有值的Boolean?
进行比较,结果将既不是True
也不是False
,相反,比较也会返回Nothing
。
在VB.NET中,没有值的可空值意味着未知值,因此如果将已知值与未知值进行比较,结果也是未知的,不是真或假。
您可以使用Nullable.HasValue
:
Dim result as Boolean? = l?.Any()
If Not result.HasValue Then
'do something
End If
相关:Why is there a difference in checking null against a value in VB.NET and C#?