奇怪的行为if()with false语句求值为true C#

时间:2017-02-01 01:00:53

标签: c#

简而言之: if 语句将语句评估为 false 正在执行 if 语句中的代码。我有证据:

第1步我的代码执行构造函数来创建无关名称类的新实例。构造函数接收CSV格式的字符串作为参数。然后字符串被','拆分,如果结果数组中的项数小于 x ,则应抛出异常

enter image description here

第2步:即使语句为false,也会引发异常!

enter image description here

第3步在哭泣和哭泣一段时间后,我会将完全相同数量的代码复制到下面几行。惊喜!代码表现如预期!

enter image description here

enter image description here

图像不言自明。没有诀窍。我真的很惊讶。

我可以通过将代码放在其预期行为的位置来解决这个问题。但在我看来,代码块的输出必须独立于它在文件中的位置!

3 个答案:

答案 0 :(得分:1)

我会更新这些价值观,也许你会展示旧的价值观?关闭并重新加载项目,因为:

我只是运行你的测试,这是我从

获得的

<强> LINQPad

enter image description here

Visual Studio (社区版)

enter image description here

甚至 Visual Studio代码

enter image description here

底线:

条件6 < 6始终评估为false。这是正确的。

答案 1 :(得分:1)

毕竟答案隐藏在@Eric Lippert的评论中

  

您是在编译发布还是调试?调试发布版本时当前行的位置有时是错误的。是否实际抛出异常?

真的没有抛出异常。虽然我正在调试调试版本,但事实是即使条件语句为false,当前行也会输入if,尽管该行未执行。

调试时,我解释说接下来要执行该行。奇怪的是,当删除下面的 try catch 块时,调试行将跳过。

我真的很尴尬你们,但事实是我已经习惯了调试,并认为突出显示的行是下一个要执行的好......

尽管如此,如果有人能解释为什么会这样,我将不胜感激。

答案 2 :(得分:0)

  

@DavidG我可以达到这一点,因为在调试时你可以将调试箭头移动到第一个“跳转”,如果它没有执行

这就是为什么你被允许继续超过第一个声明,它也将跳过第二个声明(还有更多的事情要进行,但它需要一个较小的博客文章和我成为Jon Skeet能够解释这一切)。

  

@ThomasLindvall我没有乱七八糟的断点。我知道这两个陈述都是正确的。这就是我寻求帮助的原因。我不明白为什么

6&lt; 6永远不会评估为真,在数学上不可能在西方数学中(不确定阿拉伯世界如何使用&lt;和&gt;但我看到其中一些从右到左做了更简单的操作)。查看代码下方的查看器“窗口”,它清楚地表明它是错误的。

如果您注释掉第一行,例如;

//if(strItems.Length < MinNumberOfItems)

你将在第二行崩溃

if(strItems.Length < MinNumberOfItems)

如果你想让MinNumberOfItems和strItems.Length中包含的项目数相等,你需要使用&lt; =运算符而不是&lt;。