为什么无法控制留下最终陈述?

时间:2013-04-16 08:17:11

标签: c# try-catch

当我在return语句的块中放置finally时,编译器会告诉我:

  

控制不能离开finally子句的主体

示例:

try
{
}
catch
{
}
finally
{
    return;
}

为什么会这样?

3 个答案:

答案 0 :(得分:70)

考虑一下如果你return 1区内的tryreturn 0区内的finally会发生什么......你的函数会尝试返回两个值! trycatch的组合选项在控制流方面是详尽无遗的。

答案 1 :(得分:20)

它是设计的,它在C#规范中描述:

  

breakcontinuegoto语句的编译时错误   将控制转移出finally块。当breakcontinue或。{   goto语句出现在finally块中,即语句的目标   必须在同一finally块内,否则编译时   发生错误。

     

return语句的编译时错误   发生在finally

此外,来自C# 6.0 spec draft on MSDN

  

return块中发生finally语句是编译时错误。

答案 2 :(得分:-3)

目前的答案解释了为什么会发生这种情况,但我也认为重要的是要注意在没有涉及返回值的情况下绕过这个约束是多么容易,{{1} }子句是方法中的最后一件事(经常发生):

finally

然后在try {} catch {} finally { FinallyMethod(); } 中,您可以使用FinallyMethod语句,就像您一样

return