他の人が述べているように、例外に焦点を当てていますが、それは実際には制御を移すあいまいな処理に関するものです。
頭の中で、おそらく次のようなシナリオを考えているでしょう。
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 を使用する可能性はわずかにありますが、continue
多くの (大多数?) ケースには例外またはreturn
ブロックが含まれます。言語設計者は、これはあまりにも曖昧であり、制御フローが転送されていない場合にのみcontinue
使用されることをコンパイル時に保証することは (おそらく) 不可能であると感じました。