新的C#/ VB - 引入条件的第一个不对称?

时间:2015-08-10 21:54:06

标签: c# .net vb.net negation null-conditional-operator

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。 (这就是我使用“不对称”这个词的原因。)或者我是否忽略了什么?

2 个答案:

答案 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,则您无法简单地交换ifelse部分。无论新运算符如何,向混合中添加null都会阻止使用Not

这不是运算符的错 - 它是可空的布尔值不对称的事实。