Ein Stück C # -Code
%Vor% Ich habe das Ergebnis false
in der Codeausführung erhalten,
aber wenn ich diesen Code in das WATCH-Fenster kopiere, ist das Ergebnis true
.
Dies ist keine vollständige Antwort (ich kenne die Gründe nicht, warum dieser Fehler auftritt), aber es wirft etwas Licht auf das fehlerhafte Verhalten des Debuggers, das offensichtlich fehlerhaft ist.
In erster Linie: C # erlaubt nicht (und auch AFAIK, auch CLR) Varianz-Involvivortypen; Varianz ist nur erlaubt, wenn zwischen den beteiligten Typen eine identitätsbewahrende Konvertierung stattfindet, andernfalls wird sie fehlschlagen (es gibt keine identitätsbewahrende Konvertierung für Werttypen):
%Vor% Das unmittelbare Fenster des Debuggers ist offensichtlich falsch, new List<int> { 1, 2, 3 } is IEnumerable<object>
sollte false
zurückgeben wie die Laufzeitumgebung. Warum gibt es true
zurück? Weil es einen Fehler gibt, Punkt.
Was es noch verwirrender macht, ist die Tatsache, dass new int[] { 1, 2, 3 } is IEnumerable<object>
korrekt return false
zurückgibt, wenn int[]
implizit in IEnumerable<int>
konvertiert werden kann wie List<int>
.
Der einzige Grund, warum ich das letzte richtige Verhalten finde, ist, dass der Compiler den Ausdruck immer als false
mit einer Warnung kennzeichnet und daher die Art, wie der Compiler das Array-Szenario analysiert, sich von jedem anderen IEnumerable
unterscheidet. p>