当我在return
语句的块中放置finally
时,编译器会告诉我:
控制不能离开finally子句的主体
示例:
try
{
}
catch
{
}
finally
{
return;
}
为什么会这样?
答案 0 :(得分:70)
考虑一下如果你return 1
区内的try
和return 0
区内的finally
会发生什么......你的函数会尝试返回两个值! try
和catch
的组合选项在控制流方面是详尽无遗的。
答案 1 :(得分:20)
它是设计的,它在C#规范中描述:
break
,continue
或goto
语句的编译时错误 将控制转移出finally
块。当break
,continue
或。{goto
语句出现在finally
块中,即语句的目标 必须在同一finally
块内,否则编译时 发生错误。
return
语句的编译时错误 发生在finally
块。
此外,来自C# 6.0 spec draft on MSDN:
在
return
块中发生finally
语句是编译时错误。
答案 2 :(得分:-3)
目前的答案解释了为什么会发生这种情况,但我也认为重要的是要注意在没有涉及返回值的情况下绕过这个约束是多么容易,{{1} }子句是方法中的最后一件事(经常发生):
finally
然后在try {}
catch {}
finally
{
FinallyMethod();
}
中,您可以使用FinallyMethod
语句,就像您一样
return