C# 的家伙会原谅我的 VB,但以下应该与这两种语言有关。编辑:它是相关的,但到目前为止没有人注意到 C# 和 VB 评估不同。问题调整。
以前,如果我们有简单的
If condition Then
ThenPart()
Else
ElsePart()
End If
并想将其重新排列成相反的顺序,我们交换ThenPart()并ElsePart()否定了条件(一般来说,通过使用Not(condition))。可以重新安排每个条件。
最近,引入了很棒的空条件运算符。随之而来的是不对称性。您不能再Not(condition)与它们一起使用。还是我忽略了什么?(这就是问题。)
尝试在此处重新排列 ThenPart()并按ElsePart()相反顺序排列:
Dim list As List(Of Integer) = Nothing
If list?.Count > 0 Then
ThenPart()
Else
ElsePart()
End If
诀窍是空值出现在条件中,当然,它不能使用Not. 因此,您不能使用平凡的否定If Not(list?.Count = 0),也不能使用If list?.Count <= 0.
唯一的方法是老式的If list Is Nothing OrElse list.Count = 0。 (确切的否定将使用<= 0)(编辑:仅适用于 VB。VB 和 C# 在这里分歧,见下文。)
简单地否定每个运算符的琐碎时代已经一去不复返了(编辑:仅在 VB 中)。还是我忽略了什么?
经过进一步研究:
它看起来在 C# 中你可以安全地做!(list?.Count = 0),在这个发现之后,C# 摆脱了这个问题。这里没有不对称,你可以像以前一样否定。但据我所见,VB 中的不对称性仍然存在,因为nullVisual Basic中的求值类似于 ANSI SQL——空值通过表达式传播。所以在 VB 中,你不能list?.Count > 0比If list Is Nothing OrElse list.Count = 0. (这就是我使用“不对称”这个词的原因。)还是我忽略了什么?