C#伙伴们会原谅我的VB,但以下内容应该与这两种语言有关。 编辑:这是相关的,但到目前为止没有人注意到C#和VB评估不同。调整问题。
之前,如果我们有简单的
If condition Then
ThenPart()
Else
ElsePart()
End If
并希望将其重新排列为相反的顺序,我们交换了ThenPart()
和ElsePart()
并取消了条件(一般来说,使用Not(condition)
)。可以重新安排每一个条件。
最近,介绍了很棒的Null-conditional Operators。随着他们的不对称进入了条件。 您无法再使用Not(condition)
。或者我忽略了什么?(这就是问题。)
尝试在此处重新排列ThenPart()
和ElsePart()
的相反顺序:
Dim list As List(Of Integer) = Nothing
If list?.Count > 0 Then
ThenPart()
Else
ElsePart()
End If
诀窍是null值出现在条件中,当然,使用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#摆脱了这个问题。这里没有不对称,你可以像以前一样否定。但据我所知,由于null
evaluation in Visual Basic类似于ANSI SQL,因此不对称性仍然存在于VB中 - 空值通过表达式传播。所以在VB中,你不能比list?.Count > 0
更平凡地否定If list Is Nothing OrElse list.Count = 0
。 (这就是我使用“不对称”这个词的原因。)或者我是否忽略了什么?
答案 0 :(得分:3)
你应该能够很好地否定条件:
if (!(list?.Count > 0))...
但是否定的形式没有简短形式(你必须以扩展形式生活)。
将否定转化为条件并没有什么新的东西(除了你将x != null && x.Count > 0
缩写为x?.Count > 0
时更短的方式) - 同样Morgan laws适用于否定。
原始状况(A和B):
list != null && list.Count > 0
否定(不是A或不是B):
list == null || list.Count <= 0
请注意,C#5中存在类似的可为空值的行为 - 如果您只是否定操作(例如>
到<=
),则会得到错误的结果:
int? v = null;
Console.WriteLine(v1 > 1); // false
Console.WriteLine(!(v1 > 1)); // negated, so true
Console.WriteLine(v1 <= 1); // just > negated - false.
答案 1 :(得分:3)
很容易否定每个操作员的微不足道的时间都消失了。
没有任何变化 - 如果condition
在第一个示例中可能会返回null,则您无法简单地交换if
和else
部分。无论新运算符如何,向混合中添加null
都会阻止使用Not
。
这不是运算符的错 - 它是可空的布尔值不对称的事实。