Como han dicho otros, pero centrados en las excepciones, en realidad se trata de un manejo ambiguo de la transferencia de control.
En su mente, probablemente esté pensando en un escenario como este:
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;
}
Teóricamente, puede rastrear el flujo de control y decir, sí, esto está "bien". No se lanza ninguna excepción, no se transfiere ningún control. Pero los diseñadores del lenguaje C # tenían otros problemas en mente.
La excepción lanzada
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
El temido Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
El regreso
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
El rompimiento
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Así que en conclusión, sí, mientras que no es una ligera posibilidad de utilizar una continuede las situaciones en que no se están transfiriendo el control, pero una buena oferta (la mayoría?) De los casos se trata de excepciones o returnbloques. Los diseñadores del lenguaje sintieron que esto sería demasiado ambiguo y (probablemente) imposible de garantizar en el momento de la compilación que su continuese usa solo en casos donde el flujo de control no se está transfiriendo.