Wir wissen, wenn wir eine Sammlung in einer foreach
-Schleife ändern, wird die folgende Ausnahme ausgelöst:
InvalidOperationException: Die Sammlung wurde geändert. Aufzählungsoperation kann nicht ausgeführt werden.
Aber es gibt eine Methode, die sich anders verhält: List<T>.Sort(Comparison<T>)
.
Zum Beispiel ( dotnetfiddle.net ):
%Vor%Nach der referencesource.microsoft.com können wir das sehen In dieser speziellen Methode gibt es kein Versionsinkrement, während es in der obigen Methode eins gibt:
%Vor%Version wird auch in allen anderen Methoden erhöht, die die Liste modifizieren.
Meine Fragen sind:
Wie ich mich erinnere, habe ich diesen Fehlerbericht vor etwa 8-9 Jahren an Microsoft geschickt, aber er wurde abgelehnt. Und jetzt kann ich es nicht mehr finden.
Es war ein Fehler, deshalb ist es im neuesten Quellcode behoben.
%Vor%Es kann viele ähnliche Fehler geben, es sei denn jemand berichtet und es wird als sehr riskant angesehen, sie bleiben, da sie keine Prioritäten sind.
Keine Sorge, es gab einen ähnlichen Fehler in List.ForEach
, der keine Modified Exception werfen würde, ich habe es gemeldet und sie abgelehnt, aber in der folgenden Version wurde es behoben.
Ich kann nicht sagen, warum es sich so verhält, obwohl ich fest davon überzeugt bin, dass es aus irgendeinem Grund beabsichtigt ist.
Wenn Sie sich den Quellcode hier ansehen, werden Sie feststellen dass es sich von den anderen Sortiermethoden, die IComparer<T>
verwenden, unterscheidet, da es die Version der Liste nicht erhöht.
Nun ist diese genaue Versionsnummerierung Was sagt foreach
Anweisung, dass der Enumerable geändert wurde, und wenn es sich nicht ändert, dann bedeutet dies keine Änderung, solange foreach
berücksichtigt wird.