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