Подтвердить что ты не робот

Необычное поведение троичного оператора в отладчике на платформе x64

В моем коде С# я использую очень простое тернарное выражение:

helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();

В обоих случаях функции на каждом пути выражения возвращают ненулевой объект, но если я посмотрю на результат в отладчике, он равен нулю, пока я не ссылаюсь на него в коде, например, используя assert:

Debug.Assert(helperClass.SomeData != null);

Это происходит, только если я использую настройку платформы "x64" или "Any CPU" в режиме Debug. Это нормально в режиме "x86".

Я стараюсь быть очень осторожным, прежде чем предположить, что обнаружил ошибку в компиляторе или отладчике, но я не могу найти никакого другого объяснения этого поведения.

Здесь полный класс для воспроизведения, просто вызовите SomeClass.SomeAction() в отладчике в режиме x64 и перейдите к нему:

public class SomeClass {
    public bool HasData;
    public object SomeData;

    private SomeClass() {
        HasData = false;
    }

    public static void SomeAction() {
        var helperClass = new SomeClass();
        // Exhibits weird debugger behavior of having helperClass.SomeData = null after this line:
        helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();

        // Note that trying helperClass.SomeData.ToString() returns a debugger error saying SomeData is null

        // But this code is just fine
        //if(helperClass.HasData) {
        //    helperClass.SomeData = GetSomeData();
        //} 
        //else {
        //    helperClass.SomeData = GetSomeOtherData();
        //}

        // In both cases though, after this line things are fine:
        Debug.Assert(helperClass.SomeData != null);
    }

    private static object GetSomeData() {
        return new object();
    }

    private static object GetSomeOtherData() {
        return new object();
    }
}

Я что-то упустил или это ошибка в отладчике x64? Я использую режим отладки, поэтому оптимизаций не должно быть.

4b9b3361

Ответ 1

Принимая Эрика Липперта, советуем, что это, вероятно, ошибка, я зарегистрировал официальную ошибку Connect для этой проблемы: https://connect.microsoft.com/VisualStudio/feedback/details/684202 p >

Спасибо всем за ваши отзывы!

UPDATE. Они вернулись ко мне и сказали, что исправили этот угловой случай в следующей версии компилятора. Ура!:)

Ответ 2

для меня это не похоже на ошибку в отладчике, но, возможно, на компилятор...

при изменении кода на

{ helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData(); }

генерируемый IL отличается и отладчик работает как ожидалось...