Waarom kan ik geen definitief statement achterlaten?

Als ik een returnin 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 1binnen het try-blok en return 0binnen de finallyblok… Uw functie zou twee waarden proberen terug te geven! De gecombineerde opties van tryen catchzijn 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, continueof goto-instructie om
de controle overdragen vanuit een finallyblok. Wanneer een break, continue, of
goto-instructie komt voor in een finally-blok, het doel van de instructie
moet binnen hetzelfde finallyblok zijn, of anders een compile-time
er treedt een fout op.

Het is een compile-time-fout voor een return-instructie naar
voorkomen in een finallyblok
.

Ook van C# 6.0 spec concept op MSDN:

Het is een compile-time-fout voor een return-instructie die optreedt in een finally-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 finallyclausule is het laatste in de methode(wat vaak voorkomt):

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

Vervolgens kunt u in FinallyMethodreturn-instructies zo vaak gebruiken als u wilt

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

Other episodes