Странное поведение троичного оператора в отладчике на платформе x64 - PullRequest
13 голосов
/ 15 августа 2011

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

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

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

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

Это может произойти, только если я использую настройку платформы "x64" или "Any CPU"в режиме отладки.Это нормально в режиме "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? Я использую режим отладки, поэтому никаких оптимизаций не должно быть.

Ответы [ 2 ]

9 голосов
/ 15 августа 2011

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

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

ОБНОВЛЕНИЕ : Они ответили мне и сказали, что исправили этот угловой случай в следующей версии компилятора. Ура! :)

4 голосов
/ 15 августа 2011

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

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

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

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

...