如果(false = = true)在内部引发异常时执行块

我遇到了一个很奇怪的问题。

这是我的暗号:

private async Task BreakExpectedLogic()
{
bool test = false;
if (test == true)
{
Console.WriteLine("Hello!");
throw new Exception("BAD HASH!");
}
}

看起来很简单,不应该碰到 Console.WriteLine或者 throw。 不知道为什么总是碰到 throw

如果我将 throw移动到它自己的方法中,那么它工作得很好。我的问题是,它是如何忽略 if阻塞而触及 throw new Exception的:

Here is some evidence

编辑1: 我已经更新了我的代码以包含签名,我已经删除了所有与这个问题无关的内容并运行它,它仍然会发生。

7686 次浏览

这似乎是 async方法中的错误,实际执行的代码 不是,但调试器步骤与 throw语句的行。如果在 if中的 throw语句之前有一些代码行,这些代码行将被忽略,调试器将步骤 只有到带有 throw语句的行。

此外,如果你不使用变量-if (false)if (true == false),然后调试器步骤到正确的行代码-结束花括号。

此 bug 已由 @ Matthew Watson发布到 VisualStudio 团队(现在没有链接)。

另外,参见类似的问题 -异步方法中的条件检查

编辑(2017-10-06) :

使用.Net Framework 4.7在 VS 201715.3.5中无法重现这个问题。 VS 团队似乎已经解决了这个问题。

作为答案的补充,我最近遇到了同样的问题,并在调试器中查看了实际的 x86代码,它是以一种奇怪的方式生成的,如下(简化) :

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

所以它不是直接跳到方法的最后一个指令,而是双跳,我认为第二个无条件跳转被错误地识别为 if块中代码的一部分。

所以我推测这个 bug 可能与 JIT 编译器有关。