繁体   English   中英

为什么控制不能留下finally语句?

[英]Why can't control leave a finally statement?

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

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

例子:

try
{
}
catch
{
}
finally
{
    return;
}

为什么是这样?

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

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

breakcontinuegoto语句将控制权转移出finally块是编译时错误。 当在finally块中出现breakcontinuegoto语句时,该语句的目标必须在同一个finally块内,否则会发生编译时错误。

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

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

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

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

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

然后在FinallyMethod您可以FinallyMethod地使用return语句

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM