2011-08-15 40 views
13

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.

+2

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. –

+0

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? –

+0

No; Parece que ese no es el problema. –

Respuesta

9

Siguiendo el consejo de Eric Lippert que esto es probablemente un error, me he presentado un fallo oficial Connect para este problema: https://connect.microsoft.com/VisualStudio/feedback/details/684202

¡Gracias a todos por sus comentarios!

ACTUALIZACIÓN: Se volvió a mí y me dijeron que han arreglado este caso esquina en la próxima versión del compilador. ¡Hurra! :)

4

para mí esto no parece un error en el depurador, pero posiblemente del compilador ...

al cambiar el código para

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

genera el IL es diferente y el depurador funciona como espera ...

+0

¿Por qué deberías poner {} 's alrededor? –

+0

No digo que tengas que ... solo algo que parece funcionar después de que Reflector me haya enviado un código extraño al desensamblar esa línea ... – Yahia

+0

Parece un error (tal vez solo en el compilador que sugieres). Estoy trabajando en ello convirtiéndolo en una declaración if a pesar de que ReSharper cree que soy un idiota por hacer eso :) –