Als ik een return
in het blok van een finally
-instructie plaats, vertelt de compiler me:
Control kan de hoofdtekst van een clausule ten slotte niet verlaten
Voorbeeld:
try
{
}
catch
{
}
finally
{
return;
}
Waarom is dit?
Antwoord 1, autoriteit 100%
Bedenk wat er zou gebeuren als je return 1
binnen het try
-blok en return 0
binnen de finally
blok… Uw functie zou twee waarden proberen terug te geven! De gecombineerde opties van try
en catch
zijn uitputtend in termen van controlestroom.
Antwoord 2, autoriteit 26%
Het is zo ontworpen en wordt beschreven in de C#-specificatie:
Het is een compile-time-fout voor een
break
,continue
ofgoto
-instructie om
de controle overdragen vanuit eenfinally
blok. Wanneer eenbreak
,continue
, of
goto
-instructie komt voor in eenfinally
-blok, het doel van de instructie
moet binnen hetzelfdefinally
blok zijn, of anders een compile-time
er treedt een fout op.Het is een compile-time-fout voor een
return
-instructie naar
voorkomen in eenfinally
blok.
Ook van C# 6.0 spec concept op MSDN:
Het is een compile-time-fout voor een
return
-instructie die optreedt in eenfinally
-blok.
Antwoord 3
De huidige antwoorden verklaren waarom dit goed gebeurt, maar ik denk ook dat het belangrijk is om op te merken hoe gemakkelijk het is om deze beperking te omzeilen in het geval dat er geen retourwaarde bij betrokken is, en de finally
clausule is het laatste in de methode(wat vaak voorkomt):
try {}
catch {}
finally
{
FinallyMethod();
}
Vervolgens kunt u in FinallyMethod
return
-instructies zo vaak gebruiken als u wilt
void FinallyMethod()
{
//...
if (x == y)
return;
else
a = b;
//etc.
}