如果变量值为Nothing,则使用null条件运算符会出现意外行为。
以下代码的行为让我们有些困惑。
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
结果:
- 没有假值
- 不是没有,那就是真值
- Nothing?.Any() 是假值
- Not Nothing?.Any() 也是假值
为什么最后一个 if 语句没有返回 true?
C#禁止这种检查写法…