Comme d'autres l'ont dit, mais en se concentrant sur les exceptions, il s'agit en réalité d'une gestion ambiguë du transfert de contrôle.
Dans votre esprit, vous pensez probablement à un scénario comme celui-ci:
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;
}
Théoriquement, vous pouvez suivre le flux de contrôle et dire, oui, c'est "ok". Aucune exception n'est levée, aucun contrôle n'est transféré. Mais les concepteurs du langage C # avaient d'autres problèmes en tête.
L'exception lancée
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
Le redouté Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
Le retour
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
La rupture
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Donc en conclusion, oui, bien qu'il y ait une légère possibilité d'utiliser un continuedans des situations où le contrôle n'est pas transféré, mais bon nombre (la majorité?) Des cas impliquent des exceptions ou des returnblocages. Les concepteurs de langage ont estimé que cela serait trop ambigu et (probablement) impossible à garantir au moment de la compilation que votre continuen'est utilisé que dans les cas où le flux de contrôle n'est pas transféré.