2012-08-22 15 views
6

Estoy tratando de usar un ternario para asignar un tipo de decimal. No está funcionando para mi. ¿Me estoy volviendo loco?Decimal Ternary Not Working

Aquí hay una captura de pantalla de mi depuración. Puedes ver el valor de todo antes de dar un paso. enter image description here

Y después del paso aquí es el valor. Ni siquiera es una de las opciones viables (es decir, 1 o 2000). enter image description here

¿Hay alguna limitación extraña con los decimales que no conozco? Cuando lo divido en su representación lógica if/else completa, funciona bien. Lo único que puedo adivinar es que recientemente instalé .NET Framework 4.5.

ACTUALIZACIÓN

He limpiado la solución y se aseguró de que estaba corriendo en el código que se compila en modo de depuración como se recomienda en los comentarios. Ninguno de los dos pareció cambiar nada.

Empecé a sentir curiosidad cuando noté que todas las pruebas de mi unidad todavía estaban pasando. Después de investigar un poco más, descubrí que, cuando pisé una vez más (es decir, me limité a memberItems.Add), mágicamente el precio tiene el valor correcto.

¿Realiza .Net algún tipo de resolución retrasada de operadores ternarios similar al comando de producción en bloques de iteradores? Nunca antes lo había notado, pero no sé qué más podría ser. Supongo que aún podría estar ejecutándose en código compilado en modo de lanzamiento accidentalmente. He cometido errores más tontos después de haberme controlado tres veces.

+0

Gracias por la respuesta. Mira mis capturas de pantalla. He fijado unas cuantas ventanas de visualización en ellas para que pueda ver los valores de mis variables. El precio sigue siendo 0 después del paso. –

+5

Haz una 'limpieza' y luego reconstruye. A veces, la información de depuración no se sincroniza con el código del ejecutable real. – Servy

+10

Asegúrese de que se está ejecutando en el modo de depuración, no en el modo de lanzamiento. También verifique que el 'precio' que fijó no sea por error una variable miembro con el mismo nombre. – dasblinkenlight

Respuesta

6

Imposible diagnosticar el código de una captura de pantalla, solo supongo.

No siempre se puede completamente confíe en lo que le dice una expresión de reloj. El primer modo de falla posible es el código de depuración que fue optimizado. Una variable local como precio muy típicamente se optimizará por el optimizador de fluctuación de fase que se almacenará en un registro de CPU en lugar de la pila. La expresión de observación le mostrará el valor de ubicación de la pila, no el valor de registro de la CPU. Con 0 es un resultado común. La única defensa real que tiene contra esto es solo el código de depuración que fue creado por la configuración de depuración.

El segundo modo de falla es la forma en que se evalúan las expresiones de observación. CLR inicia un subproceso dedicado cuando detecta un depurador adjunto. El depurador puede usar este hilo para evaluar expresiones de reloj. Esto puede salir mal si una variable tiene alguna afinidad de hilo. Los casos comunes son variables que son [ThreadStatic] o son propiedades de objetos COM.

+0

No creo que ninguno de los posibles problemas que mencione sea relevante en mi caso, pero para empezar es mucho más detallado de lo que sabía, así que gracias. ¿También es curioso de dónde aprendiste todo esto? ¿Algún artículo en particular o lo acabas de recoger a lo largo de los años? –

0

Tuve el mismo problema y también pensé que me estaba volviendo loco.

Descubrí que cambiar mi aplicación ASP.NET para usar "Visual Studio Developer Server" en lugar de IIS la corrige. Lástima porque me gusta usar IIS ya que está más cerca de lo que está sucediendo en la producción.