Como outros afirmaram, mas com foco nas exceções, trata-se realmente de um tratamento ambíguo da transferência de controle.
Em sua mente, você provavelmente está pensando em um cenário 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;
}
Teoricamente, você pode rastrear o fluxo de controle e dizer, sim, isso é "ok". Nenhuma exceção é lançada, nenhum controle é transferido. Mas os designers da linguagem C # tinham outros problemas em mente.
A exceção lançada
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
The Dreaded Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
O retorno
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
A separação
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Portanto, em conclusão, sim, enquanto não é uma ligeira possibilidade de usar uma continueem situações onde o controle não está sendo transferido, mas um bom negócio (maioria?) Dos casos envolvem exceções ou returnblocos. Os designers da linguagem acharam que isso seria muito ambíguo e (provavelmente) impossível de garantir no momento da compilação que o seu continueseja usado apenas nos casos em que o fluxo de controle não está sendo transferido.