Wie andere gesagt haben, sich aber auf Ausnahmen konzentrieren, geht es wirklich um die mehrdeutige Behandlung der Übertragung von Kontrolle.
In Ihrem Kopf denken Sie wahrscheinlich an ein Szenario wie dieses:
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;
}
Theoretisch können Sie den Kontrollfluss verfolgen und sagen, ja, das ist "ok". Es wird keine Ausnahme ausgelöst, keine Kontrolle übertragen. Die C # -Sprachendesigner hatten jedoch andere Probleme.
Die geworfene Ausnahme
public static void Exception()
{
try
{
foreach(var item in list)
{
try
{
throw new Exception("What now?");
}
finally
{
continue;
}
}
}
catch
{
//do I get hit?
}
}
Der gefürchtete Goto
public static void Goto()
{
foreach(var item in list)
{
try
{
goto pigsfly;
}
finally
{
continue;
}
}
pigsfly:
}
Die Rückkehr
public static object ReturnSomething()
{
foreach(var item in list)
{
try
{
return item;
}
finally
{
continue;
}
}
}
Die Trennung
public static void Break()
{
foreach(var item in list)
{
try
{
break;
}
finally
{
continue;
}
}
}
Zusammenfassend lässt sich sagen, dass es zwar eine geringfügige Möglichkeit gibt, a continuein Situationen zu verwenden, in denen die Kontrolle nicht übertragen wird, aber in vielen Fällen (Mehrheit?) Ausnahmen oder returnBlockierungen auftreten. Die Sprachdesigner waren der Meinung, dass dies zu vieldeutig und (wahrscheinlich) unmöglich wäre, um bei der Kompilierung sicherzustellen, dass Ihre continueverwendet wird nur in Fällen , in denen der Kontrollfluss nicht übertragen wird.