web-dev-qa-db-ja.com

(false == true)例外がスローされたときにブロックを実行する場合

かなり奇妙な問題が発生しています。

これは私のコードです:

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

Console.WriteLinethrowにヒットすることはないはずです。何らかの理由で、常にthrowにヒットします。

throwを独自のメソッドに移動すると、正常に機能します。私の質問は、ifブロックを無視してthrow new Exceptionをヒットする方法です。

Here is some evidence

EDIT 1:署名を含むようにコードを更新し、この問題に関係のないものをすべて削除して実行しましたが、それでも起こります。

151
George

これは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チームがこの問題を修正したようです。

175
Roman Doskoch

答えの補足として、私は最近同じ問題に遭遇し、デバッガーで実際のx86コードを調べましたが、次のような奇妙な方法で生成されました(簡略化)。

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

したがって、メソッドの最後の命令に直接ジャンプする代わりに、ダブルジャンプを実行します。2番目の無条件ジャンプは、ifブロック内のコードの一部として誤って認識されると思います。

したがって、このバグはJITコンパイラに関連している可能性があると推測します。

8
Serge Semenov