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
ogoto
transferir el control de un bloquefinally
. Cuando se produce una sentenciabreak
,continue
ogoto
en un bloquefinally
, el objetivo de la instrucción debe estar dentro del mismo bloquefinally
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 bloquefinally
.
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.
}