visual varias then que else ejemplos condiciones con anidados c#

c# - varias - if visual basic excel



El depurador entra en el bloque if() donde la condiciĆ³n es falsa (2)

Dada esta joya de código:

class Program { private static bool IsAdmin = true; static void Main(string[] args) { if (!IsAdmin) { throw new Exception(); } try { var x = 2342342; var y = 123132; } catch (Exception) { throw; } } }

Dado que this.IsAdmin produce true, esperaría que el depurador no ingrese esa instrucción if. En realidad lo hace, ¡y pisa el lanzamiento pero en realidad no lanza!

Ahora esto solo ocurre cuando tiene una excepción dentro de una instrucción if seguida de un bloque try / catch, en Visual Studio 2013, apuntando a .NET Framework 4, 64 bit, "Preferir 32 bit" desmarcado.

He confirmado esta rareza con colegas en diferentes máquinas. Pase por el siguiente código y el depurador parecerá entrar en la rama if, pero no se produce ninguna excepción:

Estoy en modo de depuración, he intentado compilar y limpiar el proyecto varias veces.

¿Puede alguien explicar por qué ocurre esto?


Este es un problema conocido causado por el jitter x64, que ocasionalmente genera información incorrecta sobre el número de línea de depuración. Puede fallar cuando una declaración hace que se generen instrucciones NOP adicionales, destinadas a alinear el código. El primer NOP se convierte en el número de línea, en lugar de la instrucción después de los NOP. Este bytes en algunos lugares, como una declaración arrojar después de una simple prueba if () y el uso de la ?? operador con operandos escalares simples. Estos NOP de alineación también son la razón por la cual es tan peligroso abortar los hilos, que se describen en esta publicación .

La solución más sencilla es Project + Properties, pestaña Build, marque la opción "Preferir 32 bits" si está disponible, establezca el objetivo de la plataforma en x86 en caso contrario. Tenga en cuenta que en realidad nada sale mal, mientras que el depurador sugiere que la instrucción throw se ejecutará, su programa no lanza una excepción.

Se está trabajando, el jitter x64 se reescribió drásticamente, un proyecto llamado RyuJIT. Se enviará en VS2015, actualmente en Vista previa.