56

当我将 areturn放在finally语句块中时,编译器会告诉我:

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

例子:

try
{
}
catch
{
}
finally
{
    return;
}

为什么是这样?

4

3 回答 3

85

考虑一下如果你return 1tryreturn 0内部和finally块内部会发生什么......你的函数将试图返回两个值!try和的组合选项catch在控制流方面是详尽的。

于 2013-04-16T08:24:25.923 回答
22

这是设计使然,并在 C# 规范中进行了描述:

将控制权转移到块外是breakcontinue或语句的编译时错误。当块中出现、或 语句时,语句的目标必须在同一块内,否则会发生编译时错误。gotofinallybreakcontinuegotofinallyfinally

return语句出现在finally块中是编译时错误

此外,来自MSDN 上的 C# 6.0 规范草案

return语句出现在finally块中是编译时错误。

于 2013-04-16T08:19:29.100 回答
-9

当前的答案解释了为什么这种情况发生得很好,但我也认为重要的是要注意在不涉及返回值的情况下绕过这个约束是多么容易,并且该finally子句是方法中的最后一件事(经常发生):

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

然后FinallyMethod你可以return尽可能多地使用语句

void FinallyMethod()
{
   //...
   if (x == y)
       return;
   else
       a = b;
   //etc.
}
于 2016-01-31T09:39:51.230 回答