C # - System.StackOverflowException mit Lambda

7

Unter welchen Umständen würde dieser Code mit System.StackOverflowException aus?

%Vor%

Aktualisieren :
Die Eigenschaft wird wie folgt geschrieben:

%Vor%

Nichts Besonderes passiert überhaupt. Die Sortierung wird auch nicht überschrieben.

    
BuddyJoe 06.05.2010, 20:43
quelle

6 Antworten

5

Sehen Sie sich den Callstack an und Sie werden sehen, welche Funktion immer wieder ausgeführt wird. Wenn dies nicht möglich ist (weil es beispielsweise in einer Produktionsumgebung ausgeführt wird), geben Sie weitere Informationen ein.

über das, was die aufgerufenen Eigenschaften aufrufen, wo diese Funktion aufgerufen wird usw.

    
Henri 06.05.2010, 20:48
quelle
5

Wenn AccountId etwas nicht-triviales tut ( alles außer Zugang zu einem lokalen Feld), dann ist das die wahrscheinlichste Wette.

Eine interessante Tatsache ist, dass technisch Sort erfordert, dass die Reihenfolge transitiv ist, und der Zeichenfolgenvergleich ist nicht immer transitiv ! Dies würde jedoch selten zu einem Stackoverflow führen (es sei denn, die Methode Sort verwendet eine Art von FP-Ansatz); es könnte dazu führen, dass es für immer läuft, aber ich glaube, dass die eingebauten Typen sogar dies abgedeckt haben (sie prüfen auf die theoretische maximale Lauflänge und brechen ab, IIRC).

Ich würde auf AccountId schauen; wenn es etwas "cleveres" tut (wie lazy-load etwas Wert von einer Eltern-Sammlung), sind die Chancen, dass der Fehler in der "clever" ist.

    
Marc Gravell 06.05.2010 20:49
quelle
5

Also hatte ich eine schwierige Situation, in der ich StackOverflow-Ausnahmen in einer Vergleichsmethode bekam.

Meine Vergleichsmethode:

%Vor%

Mein Operator:

%Vor%

Was also passiert ist, war der Operator ==, der die Equals-Methode aufgerufen hat, die dann den Operator == aufgerufen hat, als sie die Zeile this == rhs ausgeführt hat. Die Lösung bestand darin, die Zeile in Object.ReferenceEquals(this, rhs) zu konvertieren.

    
jdmichal 06.05.2010 21:00
quelle
4

Hier ist eine abgedrehte Idee:

Sind die Konten als List<Account> deklariert?

Ich frage mich, ob Accounts eine Eigenschaft ist, die als etwas anderes als List<Account> deklariert ist - zum Beispiel als IList<Account> - und Sie haben irgendwo eine statische Helferklasse mit einer Sort Erweiterungsmethode, die isn ist 't richtig implementiert. Dies könnte versuchen, die List<T>.Sort -Methode zu nutzen, wenn der übergebene Parameter ein List<T> ist, jedoch ohne die erforderliche Umwandlung in List<T> durchzuführen, was zu einer garantierten StackOverflowException führt.

Was ich meine ist das. Angenommen, Account ist eine Eigenschaft einer Klasse, die etwa so aussieht:

%Vor%

Und dann nehmen Sie an, dass Sie diese statische Klasse mit einer Sort Erweiterungsmethode haben:

%Vor%

In diesem Fall würde der von Ihnen gepostete Code ein StackOverflowException ausgeben.

Ursprüngliche Antwort:

Vielleicht ist Accounts ein Objekt einer benutzerdefinierten Erfassungsklasse, deren Methode Sort sich selbst nennt?

%Vor%

Vielleicht nennt sich die Eigenschaft AccountId selbst?

%Vor%     
Dan Tao 06.05.2010 20:46
quelle
2

StackOverflowException s tritt normalerweise auf, wenn Sie einen rekursiven Aufruf ausführen, der nicht aktiv ist. Überprüfen Sie, ob sich Sort oder AccountId selbst aufrufen. Wenn ja, überprüfen Sie die Basisfälle für diese rekursiven Funktionen und stellen Sie sicher, dass sie anhalten, wenn sie aufhören sollen.

    
Skrud 06.05.2010 20:48
quelle
2

Nur weil diese Zeile den StackOverflow wirft, bedeutet das nicht, dass es die Ursache des Problems ist, z. B.

%Vor%

Dies ist so wahrscheinlich, dass ein Stapelüberlauf auf b () auftritt, wie bei dem rekursiven Aufruf von methodA ();

Ich vermute, dass die Rekursion auf der Methode um diese Codezeile herum liegt.

    
Ian Mercer 07.05.2010 03:26
quelle