2010-01-19 21 views
27

Acabo de toparme con uno de los errores más alucinantes de la historia. falso == verdadero ¿Qué información necesitarían ustedes para confirmar/depurar este comportamiento? Nunca he visto algo así.C# ¿Cómo puede ser falso == verdadero? Ver la imagen

enter image description here

  • VS2008 SP1
  • modo de depuración | Cualquier CPU
  • IIS 7.5

Editar: hice un limpio-> reconstruir y sigue siendo el mismo.

Aquí está el conjunto y los registros. No sé cómo leer esto, pero tal vez podría ayudar a alguien más.

+0

Pruebe usar el reloj rápido para evaluar el resultado == verdadero - Imagino que evaluará a falso si su depurador muestra que el valor del resultado es falso. En este punto, ¿quizás algo está cambiando el valor del resultado después de evaluar el enunciado if? El depurador también puede cambiar el valor del resultado ... – Mayo

+5

Además, ¿por qué no deshacerse de "' == true' "? Prefiero: 'if (result)' – JMD

+0

Relacionado: en VB.net verdadero y verdadero no siempre es cierto: http://msmvps.com/blogs/bill/archive/2004/06/23/8730.aspx – recursive

Respuesta

42

Supongo que sus archivos PDB no están en fase y tiene diferencias en lo que realmente se ejecuta y lo que Visual Studio ve como un número de línea. Intenta reconstruir Todos sabemos que es imposible tener true = false, o el mundo tal como lo conocemos puede cambiar :-)

+7

La constante cosmológica está fluctuando en su wkstn ... –

+14

De vuelta en VB6 De hecho, tuve 'verdadero = falso. Durante esa misma sesión de depuración, todo el manejo de errores falló, la ejecución pasó por cada rama posible de cada declaración 'if', y el cielo se oscureció cuando los ángeles cayeron del cielo ... Tuve que reinstalar VB 3 veces ese día; nunca se dio cuenta de lo que lo causó ... Ah, los buenos viejos días ... – Rory

+2

«o el mundo tal como lo conocemos puede cambiar» → Tal vez alguien encontró la pregunta?!: o – Pikrass

7

Probablemente la fuente no corresponde a la versión en ejecución o hay un error en el depurador.

4

¿Estás seguro de que es la excepción lanzada? Mi corazonada es que su método isContextSignatureValid está lanzando una excepción, pero el depurador de Visual Studio puede adelantarse a veces y resaltar una línea que no está lanzando la excepción.

11

¿En realidad arroja el error? El depurador a menudo puede resaltar las líneas incorrectas si le da un pdb incorrecto, por lo que podría ser una pista falsa. También es trivial reproducir usando el panel "inmediato" para cambiar el valor después de la prueba.

Si result era un campo o una variable capturada, también podría establecerse mediante un código externo (quizás en otro hilo).

Si result no era un bool pero su propio tipo personalizado, sólo podría anular ==, o proporcionar una costumbre operador true/false.

+0

Tiene razón al decir que no lanza la excepción en la línea siguiente. Parece que el depurador lee un pdb diferente. –

6

Parte del problema es que está asumiendo que el depurador es 100% correcto. De hecho, no está y está sujeto a una serie de situaciones en las que los valores pueden tener pantallas incorrectas o engañosas. Las causas más comunes de esto son ...

  • No coinciden los archivos PDB. Esto normalmente generará al menos un cuadro de diálogo de advertencia en el depurador sobre archivos de origen no coincidentes, pero no siempre
  • Inspección de datos simple o error de visualización por parte del evaluador de expresiones subyacente. No es probable en este caso, ya que es un simple tipo local y un tipo primitivo.
  • Optimizaciones que causan que los datos se muestren incorrectamente.

Pero de hecho es casi seguro que no es falso. La forma más fácil de verificar esto es usar una llamada Debug.WriteLine para imprimir el valor en la ventana de salida.

2

sólo para añadir una pequeña sugerencia:

Si alguna vez tienes resultados confusos desde el depurador, se pega un Console.WriteLine() en ese país y obtener el código en sí mismo que le diga lo que está pasando. Esto a menudo puede aclarar la confusión.

(También puede obtener un efecto como este cuando se depura código de liberación, pero dijo que era una versión de depuración que elimina ese sospechoso)

3

Tal vez movido el puntero de instrucción actual (flecha amarilla) con el ratón sin darse cuenta mientras estaba en modo descanso ... Me pasó una vez y me volteé. :-)

0

He visto este tipo de cosas antes. Un compañero de trabajo estaba convencido de que había descubierto un error en .Net Framework o CLR. Al final, fue solo un problema antiguo de ensamblaje o sincronización de pdb.

Cuestiones relacionadas