我有一个相当奇怪的问题正在发生。
这是我的代码
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
编辑1 我已更新我的代码以包含签名,我删除了与此问题无关的所有内容并运行它,它仍然会发生
答案 0 :(得分:172)
似乎是async
方法中的错误,代码不是实际执行但调试程序步入throw
语句行。如果throw
语句中的if
语句之前有一些代码行被忽略,则调试器会将仅步骤到throw
语句的行。
此外,如果您不使用变量 - if (false)
或if (true == false)
,那么调试器将执行正确的代码行 - 到结束大括号。
@Matthew Watson 已将此错误发布到Visual Studio团队(链接现在不可用)。
另外,请参阅类似问题 - Condition check in async method
编辑(2017/10/06):
使用.Net Framework 4.7无法在VS 2017 15.3.5中复制问题。似乎VS团队已经解决了这个问题。
答案 1 :(得分:8)
只是答案的附录,我最近遇到了同样的问题,并查看了调试器中的实际x86代码,它是以这样一种奇怪的方式生成的(简化):
// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret
因此,不是直接跳转到方法的最后一条指令,而是双跳,我认为第二次无条件跳转被错误地识别为if
块内代码的一部分。
所以我推测这个bug可能与JIT编译器有关。