如果(false == true)在抛出exception的时候执行block

我有一个相当奇怪的问题正在发生。

这是我的代码

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

似乎很简单,它不应该击中Console.WriteLinethrow 。 出于某种原因,它总是在throw

如果我把throw自己的方法,那么它工作正常。 我的问题是,它是如何忽略if块并击中throw new Exception

这是一些证据

编辑1我已经更新我的代码,包括签名,我已经删除了一切与这​​个问题没有关系,并运行它,它仍然发生

这似乎是async方法中的错误,代码实际上并没有执行,但debugging程序步骤到与throw语句的行。 如果在throw语句之前有一些代码行, if这些行被忽略,那么debugging程序就会使用throw语句执行。

另外,如果你不使用variables – if (false)或者if (true == false)那么debugging器会跳到正确的代码行 – 到大括号。

此错误已由@Matthew Watson发布到Visual Studio团队 – Visual Studio问题 。

另外,看到类似的问题 – 条件检查asynchronous方法

编辑:

链接现在不可用。 在VS 2017与上次更新问题是不固定的。

编辑(2017/10/06):

问题不能在VS 2017 15.3.5中使用.Net Framework 4.7复制。 好像VS团队已经解决了这个问题。

只是答案的附录,我最近遇到了同样的问题,并在debugging器中查找实际的x86代码,它是以一种奇怪的方式生成的(简化):

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

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

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