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()
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.
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.
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:
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.
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.
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%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.