Tengo un problema bastante extraño que está ocurriendo.
Este es mi código:
private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}Parece realmente simple, no debería golpear el Console.WriteLineo el throw. Por alguna razón, siempre está golpeando el throw.
Si muevo throwa su propio método, entonces funciona bien. Mi pregunta es cómo ignora el ifbloque y golpea el throw new Exception:
EDITAR 1: He actualizado mi código para incluir la firma, he eliminado todo lo que no está relacionado con este problema y lo ejecuté, todavía sucede.
                    
                        c#
                                .net
                                visual-studio
                                .net-core
                                
                    
                    
                        Jorge
fuente
                
                fuente


Mainy ... sorpresa, norepro. O te equivocas o te has perdido algunos detalles importantes.asyncmétodo por casualidad? Porque parece similar a stackoverflow.com/questions/42528458/…Respuestas:
Parece ser el error en el
asyncmétodo, el código no se ejecuta realmente, pero los pasos del depurador a la línea con lathrowdeclaración. Si hay algunas líneas de código antes de que se ignore lathrowdeclaración dentro deifestas líneas, el depurador solo avanza a la línea con lathrowdeclaración.Además, si no utiliza la variable,
if (false)oif (true == false)luego los pasos del depurador en la línea de código correcta, en la llave de cierre.Este error ha sido publicado por @Matthew Watson al equipo de Visual Studio (el enlace no está disponible ahora).
También, vea una pregunta similar - Verificación de condición en método asíncrono
EDITAR (2017/10/06):
El problema no se puede reproducir en VS 2017 15.3.5 con .Net Framework 4.7. Parece que el equipo VS ha solucionado este problema.
fuente
Solo un apéndice a la respuesta, recientemente encontré el mismo problema y busqué el código x86 real en el depurador, y se generó de una manera extraña como esta (simplificado):
Entonces, en lugar de saltar directamente a las últimas instrucciones del método, hace doble salto, donde creo que el segundo salto incondicional se reconoce erróneamente como parte del código dentro del
ifbloque.Entonces, especularía que este error podría estar relacionado con el compilador JIT.
fuente