当我将 areturn
放在finally
语句块中时,编译器会告诉我:
控制不能离开 finally 子句的主体
例子:
try
{
}
catch
{
}
finally
{
return;
}
为什么是这样?
考虑一下如果你return 1
在try
块return 0
内部和finally
块内部会发生什么......你的函数将试图返回两个值!try
和的组合选项catch
在控制流方面是详尽的。
这是设计使然,并在 C# 规范中进行了描述:
将控制权转移到块外是
break
、continue
或语句的编译时错误。当块中出现、或 语句时,语句的目标必须在同一块内,否则会发生编译时错误。goto
finally
break
continue
goto
finally
finally
return
语句出现在finally
块中是编译时错误。
此外,来自MSDN 上的 C# 6.0 规范草案:
return
语句出现在finally
块中是编译时错误。
当前的答案解释了为什么这种情况发生得很好,但我也认为重要的是要注意在不涉及返回值的情况下绕过这个约束是多么容易,并且该finally
子句是方法中的最后一件事(经常发生):
try {}
catch {}
finally
{
FinallyMethod();
}
然后FinallyMethod
你可以return
尽可能多地使用语句
void FinallyMethod()
{
//...
if (x == y)
return;
else
a = b;
//etc.
}