visual tipos tag studio remarks example datos c# try-catch

c# - tipos - ¿Por qué no puede controlar dejar una declaración final?



tag c# (3)

Cuando hago una return dentro del bloque de una declaración final, el compilador me dice:

El control no puede abandonar el cuerpo de una cláusula final

Ejemplo:

try { } catch { } finally { return; }

¿Por qué es esto?


Considera lo que sucedería si return 1 dentro del bloque try y return 0 dentro del bloque finally ... ¡Tu función intentaría devolver dos valores! Las opciones combinadas de try y catch son exhaustivas en términos de flujo de control.


Es por diseño y se describe en la especificación C #: 8.10 La declaración try .

Es un error en tiempo de compilación para una instrucción break , continue o goto transferir el control de un bloque finally . Cuando se produce una sentencia break , continue o goto en un bloque finally , el objetivo de la instrucción debe estar dentro del mismo bloque finally o, de lo contrario, se produce un error en tiempo de compilación.

Es un error en tiempo de compilación para que se produzca una declaración de return en un bloque finally .


Las respuestas actuales explican por qué esto sucede bien, pero también creo que es importante señalar lo fácil que es eludir esta restricción en el caso de que no se involucre ningún valor de retorno, y la cláusula finally es lo último en el método (lo que sucede a menudo) :

try {} catch {} finally { FinallyMethod(); }

Luego, en FinallyMethod puedes usar declaraciones de return tanto como quieras

void FinallyMethod() { //... if (x == y) return; else a = b; //etc. }