否定 null 条件运算符 returns 没有意外的结果
Negating the null conditional operator returns unexpected results for nothing
如果变量值为 Nothing,我们遇到空条件运算符的意外行为。
以下代码的行为让我们有点困惑
Dim l As List(Of Object) = MethodThatReturnsNothingInSomeCases()
If Not l?.Any() Then
'do something
End If
预期的行为是如果 l
没有条目或 l
为 Nothing,则 Not l?.Any()
为真。但如果 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
结果:
- 没有什么是虚假的
- 不是什么都不是真的
- 什么都没有?.Any() 是假的
- 什么都不是?.Any() 是假的
如果计算结果为真,为什么不是最后一个?
C# 完全阻止我编写这种检查...
在 VB.NET 中,Nothing
不等于或不等于任何其他内容(类似于 SQL),与 C# 不同。因此,如果将 Boolean
与没有值的 Boolean?
进行比较,则结果既不会是 True
也不会是 False
,而比较结果将是 return 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#?
如果变量值为 Nothing,我们遇到空条件运算符的意外行为。
以下代码的行为让我们有点困惑
Dim l As List(Of Object) = MethodThatReturnsNothingInSomeCases()
If Not l?.Any() Then
'do something
End If
预期的行为是如果 l
没有条目或 l
为 Nothing,则 Not l?.Any()
为真。但如果 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
结果:
- 没有什么是虚假的
- 不是什么都不是真的
- 什么都没有?.Any() 是假的
- 什么都不是?.Any() 是假的
如果计算结果为真,为什么不是最后一个?
C# 完全阻止我编写这种检查...
在 VB.NET 中,Nothing
不等于或不等于任何其他内容(类似于 SQL),与 C# 不同。因此,如果将 Boolean
与没有值的 Boolean?
进行比较,则结果既不会是 True
也不会是 False
,而比较结果将是 return 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#?