Come altri hanno affermato, ma incentrato sulle eccezioni, si tratta in realtà di una gestione ambigua del trasferimento del controllo.
Nella tua mente, probabilmente stai pensando a uno scenario come questo:
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;
}
Teoricamente, puoi monitorare il flusso di controllo e dire, sì, questo è "ok". Non viene generata alcuna eccezione, nessun controllo viene trasferito. Ma i progettisti del linguaggio C # avevano in mente altri problemi.
L'eccezione lanciata
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
Il temuto Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
Il ritorno
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
La separazione
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Quindi, in conclusione, sì, sebbene vi sia una leggera possibilità di utilizzare a continuein situazioni in cui il controllo non viene trasferito, ma una buona parte (la maggioranza?) Dei casi comporta eccezioni o returnblocchi. I progettisti del linguaggio hanno ritenuto che ciò sarebbe stato troppo ambiguo e (probabilmente) impossibile per garantire al momento della compilazione che il tuo continuesia utilizzato solo nei casi in cui il flusso di controllo non viene trasferito.