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团队已经解决了这个问题.
只是答案的附录,我最近遇到了同样的问题,并且在调试器中查看了实际的x86代码,它是以这样一种奇怪的方式生成的(简化):
// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret
Run Code Online (Sandbox Code Playgroud)
因此,它不是直接跳转到方法的最后一个指令,而是双跳,我相信第二个无条件跳转被错误地识别为if
块内代码的一部分.
所以我推测这个bug可能与JIT编译器有关.
归档时间: |
|
查看次数: |
7263 次 |
最近记录: |