如果(false == true)在抛出异常时执行阻止

Geo*_*rge 151 .net c# visual-studio .net-core

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

这是我的代码

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

看起来真的很简单,不应该打Console.WriteLine或者throw.由于某种原因,它总是击中throw.

如果我移动throw到自己的方法然后它工作正常.我的问题是它是如何忽略if阻挡并击中阻挡的throw new Exception

这是一些证据

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

Rom*_*och 175

它似乎是async方法中的错误,代码实际上并没有执行,而是调试器步骤到throw语句行.如果在忽略这些行中的throw语句之前存在一些代码if行,则调试器步骤到带throw语句的行.

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

@Matthew Watson已将此错误发布到Visual Studio团队(链接现在不可用).

此外,请参阅类似的问题 - 异步方法中的条件检查

编辑(2017/10/06):

使用.Net Framework 4.7无法在VS 2017 15.3.5中复制问题.似乎VS团队已经解决了这个问题.

  • 调试器中的错误?怎么非常元.:)(唱歌*我从来没有像这样的meta bug ...*) (120认同)
  • 谢谢,不知道这是调试器中的一个错误,我可能会发疯. (20认同)
  • @Simba:告诉我你从未使用调试器来调试自己. (5认同)
  • @George我希望你不介意,我已经拿了你的样本并使用它创建了一个控制台应用程序,并将其附加到Roma已链接到的VS问题上. (3认同)
  • 嗯.似乎错误可能在编译器生成的调试信息中,而不是在调试器本身.我会等待MS在投票或投票前确认Connect错误. (3认同)
  • @ObsidianPhoenix当然不是,任何可以帮助解决这个问题的东西都可以解决:) (2认同)
  • @Joshua我有一个调试器,它只调试那些不自行调试的程序.问题:调试器是否自行调试?https://en.wikipedia.org/wiki/Barber_paradox (2认同)

Ser*_*nov 8

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

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret
Run Code Online (Sandbox Code Playgroud)

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

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