56

returnステートメントのブロック内にa を配置するfinallyと、コンパイラは次のように通知します。

コントロールは、finally 句の本体を離れることはできません

例:

try
{
}
catch
{
}
finally
{
    return;
}

どうしてこれなの?

4

3 に答える 3

85

ブロックの内側とブロックreturn 1の内側にいるとどうなるか考えてみてください... 関数は 2 つの値を返そうとします! と を組み合わせたオプションは、制御フローに関して網羅的です。tryreturn 0finallytrycatch

于 2013-04-16T08:24:25.923 に答える
22

これは仕様によるものであり、C# 仕様で説明されています。

breakcontinue、またはgotoステートメントがfinallyブロックの外に制御を移すのは、コンパイル時エラーです。、breakcontinueまたは gotoステートメントがfinallyブロック内にある場合、ステートメントのターゲットは同じfinallyブロック内にある必要があります。そうでない場合、コンパイル時エラーが発生します。

ブロック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 に答える