Habe ich wirklich einen String-Datentyp in ein IEnumerability eingefügt

8

Ok, das ist ein bisschen komisch. Ignoriere, was ich versuche, und schau dir das Ergebnis dessen an, was in dieser Situation passiert.

Der Code:

%Vor%

Die Situation:

Die Zeile numbers = rawNumbers.Split(',').Cast<int>(); erscheint , um zu funktionieren, und es wird keine Ausnahme ausgelöst. Wenn ich jedoch über die Sammlung iteriere, wird InvalidCastException ausgelöst.

Jetzt drill down in die Quelle und schauen Sie sich CastIterator<TResult> an. Dies scheint bei for (int i = 0; i < numbers.Count(); i++) ... speziell numbers.Count()

aufgerufen zu werden %Vor%

Der Fehler tritt bei der Umwandlung auf, und wenn ich mir die Daten in source varaible anschaue, ist das eine Zeichenfolge [].

Ich hätte gedacht, dass seit der Zeile, wo ich den Cast zu einem int aufrufen würde, alles erfolgreich war. Was passiert hinter dem Vorhang? Wird das String-Array wirklich nur irgendwo gespeichert und nicht an T weitergegeben, bis es aufgerufen wird? Faule Casting vielleicht?

Ich weiß, ich kann nicht tun: (int) "42". Meine Fragen sind nicht, wie die Besetzung funktioniert, sondern was passiert. Zurückgestellte Ausführung der Besetzung? Es scheint komisch, dass die Zeile, wo ich Cast<int>() ausrufe, zu funktionieren scheint, aber wirklich nicht.

    
Joe 10.11.2010, 20:15
quelle

5 Antworten

8

Wie bereits erwähnt, ist hier die "verzögerte Ausführung" das Problem. Viele LINQ-Operatoren führen nicht dazu, dass Ihr Lambda-Code tatsächlich ausgeführt wird, bis Sie über die Ergebnisvariable iterieren.

Ein Grund dafür ist, dass Sie eine komplexe Reihe von Operationen erstellen können, die gleichzeitig ausgeführt werden können, anstatt als eine Folge von separaten Operationen. Dies kann eine nützliche Sache sein - aber es kann auch schwierig sein, wenn Sie es nicht erwarten.

    
Andrew Barber 10.11.2010, 20:27
quelle
24

Ein paar Dinge: Erstens können Sie nicht casten ein string auf ein int . Sie können eine Zeichenfolge analysieren und eine resultierende Ganzzahl abrufen. Aber im Wesentlichen versuchen Sie das zu tun:

%Vor%

Das ist eine Ausnahme. Zweitens sind die LINQ-Operatoren verzögerte Ausführung, so dass nichts wirklich passiert, bis Sie versuchen, das Ergebnis zu iterieren, dann beginnt die eigentliche Arbeit.

Bei der verzögerten Ausführung wird nicht überprüft, ob die Operationen, die Sie anfordern, gültig sind oder ordnungsgemäß ausgeführt werden können, sie richten nur die Operationen ein und versuchen dann, sie einzeln bei der Iteration auszuführen.

    
CodingGorilla 10.11.2010 20:19
quelle
5

Der Grund, warum Sie nicht sofort einen Fehler in der Cast<int>() -Zeile bekommen, ist, weil Sie daran denken, dass dies nur die Reihenfolge der Operationen verkettet. Erst wenn Sie über die Sammlung iterieren, werden die Konvertierungen ausgeführt.

rawNumbers.Split(',') passiert sofort, aber die Cast<int>() ist eine verzögerte Berechnung.

Wenn Sie eine ToList () oder ToArray () in diese Zeile eingefügt haben, wäre sie sofort ausgeführt worden.

    
puffpio 10.11.2010 20:22
quelle
5

Der Grund, dass Cast zu funktionieren scheint, liegt daran, dass IEnumerable beim Aufruf der Methode nicht aufgelistet wird, sondern beim Aufruf von Count() . Also, der Aufruf von Cast() macht wirklich nichts. Der Code schlägt fehl, sobald der Cast tatsächlich ausgewertet wird.

Anstatt zu versuchen, zu casten, machen Sie einfach eine einfache Umwandlung.

%Vor%     
jjnguy 10.11.2010 20:18
quelle
-1

Ich mag mich irren, aber ich frage mich, ob es mit der Umwandlung zwischen int und string zu tun hat. Ich bekomme immer Fehler, wenn ich vergesse, dass man mit (int) nicht gegen einen String casten kann, stattdessen muss man int.Parse verwenden. Es hat wahrscheinlich etwas damit zu tun, aber das ist nur von der Spitze meines Kopfes.

    
Mike Cheel 10.11.2010 20:21
quelle

Tags und Links