我已经看到了这个例子:为什么在C#6.0中交换内部'finally'和'outer'的执行顺序?
static void Main(string[] args)
{
Console.WriteLine("Start");
try
{
SomeOperation();
}
catch (Exception) when (EvaluatesTo())
{
Console.WriteLine("Catch");
}
finally
{
Console.WriteLine("Outer Finally");
}
}
private static bool EvaluatesTo()
{
Console.WriteLine($"EvaluatesTo: {Flag}");
return true;
}
private static void SomeOperation()
{
try
{
Flag = true;
throw new Exception("Boom");
}
finally
{
Flag = false;
Console.WriteLine("Inner Finally");
}
}
将会产生下一个输出:
Start
EvaluatesTo: True
Inner Finally
Catch
Outer Finally
这听起来怪我,我期待这个顺序来包装它的一个很好的解释在我的脑海中。我期待when
前要执行的finally
块:
Start
Inner Finally
EvaluatesTo: True
Catch
Outer Finally
的文档指出这个执行顺序是正确的,但它并没有在它为什么这样做了阐述和究竟是执行规则在此点餐。
@RahulTripathi不,我的问题是关于在C#6.0中交换执行顺序,这个问题在6.0之前有一个在香草C#中的直接执行顺序 – Archeg
这是一个不可避免的结果,当*子句起作用时。 CLR无法确定最终需要执行的内容,直到*找出catch子句将处理异常之后。只有这样它才能开始展开堆栈,最终执行块。 when表达式的可能的无意的副作用是为什么在v6之前它被排除在C#语言之外。 –
@HansPassant具体而言,这是如此:“CLR无法弄清楚最终需要执行的内容,直到它找出catch子句将处理异常为止。”? –