VS-Debug-Problem, wer kann mir helfen, das unten zu erklären?

9

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 .

    
Raymond He 30.11.2017, 07:31
quelle

1 Antwort

0

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>     

InBetween 30.11.2017, 08:24
quelle

Tags und Links