如果变量值为 Nothing,我们会遇到与 null 条件运算符有关的意外行为。
以下代码的行为让我们有些困惑
Dim l As List(Of Object) = MethodThatReturnsNothingInSomeCases()
If Not l?.Any() Then
'do something
End If
Not l?.Any()
如果l
没有条目或什么都没有,则预期的行为是真实l
的。但如果l
is 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() 是假的
- Not Nothing?.Any() 是假的
如果评估为真,为什么不是最后一个?
C# 完全阻止我编写这种检查......