It seems to be the bug in async
method, the code is not actually executed but debugger steps to the line with throw
statement. If there are some lines of code before throw
statement inside if
these lines are ignored, debugger steps only to the line with throw
statement.
Also, if you don't use variable - if (false)
or if (true == false)
then debugger steps to the correct line of code - to the closing curly brace.
This bug has been posted by @Matthew Watson to Visual Studio team (link is not available now).
Also, see similar question - Condition check in async method
EDIT (2017/10/06):
Issue cannot be reproduced in VS 2017 15.3.5 using .Net Framework 4.7. Seems like VS team has fixed this issue.
Just an addendum to the answer, I've recently encountered the same issue, and looked to the actual x86 code in the debugger, and it was generated in a weird way like this (simplified):
// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret
So instead of directly jumping to the last instructions of the method, it does double jump, where I believe the second unconditional jump is mistakenly recognized as a part of the code inside if
block.
So I would speculate that this bug might be related to JIT compiler.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With