他の人が述べたように、例外に焦点を当てたように、それはコントロールを移すことの曖昧な処理についてです。
あなたの心の中で、あなたはおそらくこのようなシナリオを考えているでしょう:
public static object SafeMethod()
{
foreach(var item in list)
{
try
{
try
{
//do something that won't transfer control outside
}
catch
{
//catch everything to not throw exceptions
}
}
finally
{
if (someCondition)
//no exception will be thrown,
//so theoretically this could work
continue;
}
}
return someValue;
}
理論的には、制御フローを追跡して、はい、これで「大丈夫」と言うことができます。例外はスローされず、コントロールは転送されません。ただし、C#言語の設計者には他にも問題があった。
スローされた例外
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
恐怖の後藤
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
リターン
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
ブレイクアップ
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
したがって、結論として、はい、コントロールが転送されていない状況でaを使用する可能性は少しありますが、多くの場合(大部分?)には例外またはブロックが含まれます。言語設計者は、これが曖昧であり、コンパイル時に制御フローが転送されていない場合にのみ使用されることを確認するのは(おそらく)不可能であると感じました。continuereturncontinue