Як заявили інші, але зосереджені на винятках, мова йде дійсно про неоднозначне поводження з передачею контролю.
На вашу думку, ви, мабуть, думаєте про такий сценарій:
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;
}
}
}
Отже , у висновку, та, хоча це невелика можливість використання continueв ситуаціях , коли управління не передаються, але багато (більшість?) Випадків включають виняток або returnблоки. Мовні дизайнери вважають, що це буде занадто неоднозначно і (ймовірно) неможливо забезпечити під час компіляції, що ваш continueвикористовується лише у випадках, коли потік управління не передається.