Ich gehe auf die Nerven, indem ich dies poste, aber ich denke, dass die Antwort lautet:
Zwischen 550 und 575
mit Standardeinstellungen in Visual Studio 2015
Ich habe ein kleines Programm erstellt, das verschachtelte for
Schleifen generiert ...
for (int i0=0; i0<10; i0++)
{
for (int i1=0; i1<10; i1++)
{
...
...
for (int i573=0; i573<10; i573++)
{
for (int i574=0; i574<10; i574++)
{
Console.WriteLine(i574);
}
}
...
...
}
}
Für 500 verschachtelte Schleifen kann das Programm weiterhin kompiliert werden. Mit 575 Schleifen rettet der Compiler:
Warnung AD0001 Analyzer 'Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames.CSharpSimplifyTypeNamesDiagnosticAnalyzer' hat eine Ausnahme vom Typ 'System.InsufficientExecutionStackException' mit der Meldung 'Unzureichender Stack ausgelöst, um die sichere Ausführung des Programms fortzusetzen. Dies kann passieren, wenn zu viele Funktionen auf dem Aufrufstapel oder auf dem Stapel zu viel Stapelspeicherplatz vorhanden sind. '
mit der zugrunde liegenden Compiler-Nachricht
Fehler CS8078: Ein Ausdruck ist zu lang oder zu komplex zum Kompilieren
Dies ist natürlich ein rein hypothetisches Ergebnis. Wenn die innerste Schleife mehr als a Console.WriteLine
ausführt, sind möglicherweise weniger verschachtelte Schleifen möglich, bevor die Stapelgröße überschritten wird. Dies ist möglicherweise auch keine rein technische Grenze, da möglicherweise versteckte Einstellungen vorhanden sind, um die maximale Stapelgröße für den in der Fehlermeldung genannten "Analyzer" oder (falls erforderlich) für die resultierende ausführbare Datei zu erhöhen. Dieser Teil der Antwort bleibt jedoch den Leuten überlassen, die C # genau kennen.
Aktualisieren
Als Antwort auf die Frage in den Kommentaren :
Es würde mich interessieren, wenn diese Antwort erweitert würde, um experimentell zu "beweisen", ob Sie 575 lokale Variablen auf den Stapel legen können, wenn sie nicht in for-Schleifen verwendet werden, und / oder ob Sie 575 nicht verschachtelte for-Schleifen einfügen können eine einzige Funktion
In beiden Fällen lautet die Antwort: Ja, das ist möglich. Beim Füllen der Methode mit 575 automatisch generierten Anweisungen
int i0=0;
Console.WriteLine(i0);
int i1=0;
Console.WriteLine(i1);
...
int i574=0;
Console.WriteLine(i574);
es kann noch kompiliert werden. Alles andere hätte mich überrascht. Die für die int
Variablen erforderliche Stapelgröße beträgt nur 2,3 KB. Aber ich war neugierig und um weitere Grenzen zu testen, habe ich diese Zahl erhöht. Schließlich wurde es nicht kompiliert, was den Fehler verursachte
Fehler CS0204: Nur 65534 Einheimische, einschließlich der vom Compiler generierten, sind zulässig
Das ist ein interessanter Punkt, wurde aber bereits an anderer Stelle beobachtet: Maximale Anzahl von Variablen in der Methode
In ähnlicher Weise 575 nicht verschachtelte for
Schleifen, wie in
for (int i0=0; i0<10; i0++)
{
Console.WriteLine(i0);
}
for (int i1=0; i1<10; i1++)
{
Console.WriteLine(i1);
}
...
for (int i574=0; i574<10; i574++)
{
Console.WriteLine(i574);
}
kann auch kompiliert werden. Hier habe ich auch versucht, das Limit zu finden, und mehr dieser Schleifen erstellt. Insbesondere war ich mir nicht sicher, ob die Schleifenvariablen in diesem Fall auch als "Einheimische" gelten, weil sie in ihren eigenen sind { block }
. Mehr als 65534 ist jedoch nicht möglich. Schließlich habe ich einen Test hinzugefügt, der aus 40000 Schleifen des Musters besteht
for (int i39999 = 0; i39999 < 10; i39999++)
{
int j = 0;
Console.WriteLine(j + i39999);
}
das enthielt eine zusätzliche Variable in der Schleife, aber diese scheinen auch als "Einheimische" zu zählen, und es war nicht möglich, diese zu kompilieren.
Zusammenfassend: Die Grenze von ~ 550 wird tatsächlich durch die Verschachtelungstiefe der Schleifen verursacht. Dies wurde auch durch die Fehlermeldung angezeigt
Fehler CS8078: Ein Ausdruck ist zu lang oder zu komplex zum Kompilieren
Die Dokumentation des Fehlers CS1647 spezifiziert leider (aber verständlicherweise) keine "Messung" der Komplexität, sondern gibt nur den pragmatischen Rat
Es gab einen Stapelüberlauf im Compiler, der Ihren Code verarbeitete. Vereinfachen Sie Ihren Code, um diesen Fehler zu beheben.
Um dies noch einmal zu betonen: Für den speziellen Fall tief verschachtelter for
Schleifen ist dies alles eher akademisch und hypothetisch . Die Websuche nach der Fehlermeldung von CS1647 zeigt jedoch mehrere Fälle, in denen dieser Fehler für Code auftrat, der höchstwahrscheinlich nicht absichtlich komplex war, sondern in realistischen Szenarien erstellt wurde.