Inkonsistentes Verhalten: Beim Aufruf in einer foreach-Schleife wird keine Ausnahme in der ListT.Sort-Methode ausgelöst

8

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:

  1. Ist das ein Fehler? Oder gibt es einen Grund für dieses Verhalten?
  2. Wenn es ein Bug ist, warum wurde er jahrelang nicht repariert?

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.

    
Dmitry 13.01.2017, 13:30
quelle

2 Antworten

2

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.

    
Akash Kava 02.02.2017, 07:23
quelle
0

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.

    
Ghasan Al-Sakkaf 02.02.2017 07:03
quelle

Tags und Links