estoy usando un muy simple expresión ternaria en mi código C#:Comportamiento extraño ternaria operador en el depurador en la plataforma x64
helperClass.SomeData = helperClass.HasData ? GetSomeData() : GetSomeOtherData();
En ambos casos, las funciones de cada camino de la expresión devuelve un no nulo objeto, pero si miro el resultado en el depurador, es nulo hasta que hacen referencia a él en el código como el uso de una aserción:
Debug.Assert(helperClass.SomeData != null);
Esto sólo parece ocurrir si uso una "x 64" o " Cualquier configuración de plataforma de CPU en el modo de depuración. Está bien en el modo "x86".
Intento ser muy precavido antes de asumir que he encontrado un error en el compilador o el depurador, pero no puedo encontrar ninguna otra explicación para este comportamiento.
Aquí es una clase llena de hacer una repro, simplemente llame SomeClass.SomeAction() en el depurador en modo de 64 bits y de paso a través para verlo:
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();
}
}
Me estoy perdiendo algo o se trata de un error en el depurador x64? Estoy usando el modo de depuración para que no haya optimizaciones.
Tenga en cuenta que * los símbolos de depuración generados * y * las optimizaciones generadas * son en realidad ortogonales. Es legal, aunque algo inusual, activar símbolos de depuración y optimizaciones al mismo tiempo. Puede que quieras verificar que no estás en esa extraña configuración. –
La casilla de verificación "Optimizar código" en la pestaña "Crear" está desmarcada para mi configuración activa (Debug/x64). ¿Debo consultar en otro lugar? –
No; Parece que ese no es el problema. –