かなり奇妙な問題が発生しています。
これは私のコードです:
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
をヒットする方法です。
EDIT 1:署名を含むようにコードを更新し、この問題に関係のないものをすべて削除して実行しましたが、それでも起こります。
これはasync
メソッドのバグのようです。コードは実際には実行されませんが、デバッガーはthrow
の行に進みますステートメント。 throw
内のif
ステートメントの前にいくつかのコード行がある場合、これらの行は無視され、デバッガーステップonlythrow
ステートメント。
また、変数[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
したがって、メソッドの最後の命令に直接ジャンプする代わりに、ダブルジャンプを実行します。2番目の無条件ジャンプは、if
ブロック内のコードの一部として誤って認識されると思います。
したがって、このバグはJITコンパイラに関連している可能性があると推測します。