Jak stwierdzili inni, ale skupili się na wyjątkach, tak naprawdę chodzi o niejednoznaczne traktowanie przekazywania kontroli.
Myślisz prawdopodobnie o takim scenariuszu:
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;
}
Teoretycznie można prześledzić przepływ sterowania i powiedzieć, że tak, to jest „ok”. Żaden wyjątek nie jest zgłaszany, nie jest przekazywana żadna kontrola. Ale projektanci języka C # mieli na myśli inne problemy.
Wyrzucony wyjątek
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
Dreaded Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
Powrót
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
Zerwanie
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Tak na zakończenie, tak, natomiast nie jest niewielkie możliwość użycia continuew sytuacjach, gdy kontrola nie jest przekazywana, ale sporo (większość?) Przypadków dotyczyć wyjątki lub returnbloków. Projektanci języka uznali, że byłoby to zbyt niejednoznaczne i (prawdopodobnie) niemożliwe do zapewnienia w czasie kompilacji, że Twój continuejest używany tylko w przypadkach, gdy przepływ sterowania nie jest przenoszony.