Betrachten Sie die folgende enum-Deklaration und das int-Array:
%Vor% Um dieses int[]
-Array in ein Test[]
-Array umzuwandeln, können wir das einfach tun:
Ich habe das zunächst versucht:
%Vor%Dies löst jedoch zur Laufzeit eine Ausnahme aus:
System.ArrayTypeMismatchException: Der Quell-Array-Typ kann nicht dem Ziel-Array-Typ zugewiesen werden.
Frage eins
Gibt es eine Möglichkeit, dies mit Linq und Cast<>
ohne einen Fehler zu tun, oder muss ich einfach Array.Convert()
verwenden?
Frage zwei (hinzugefügt, nachdem die erste Frage richtig beantwortet wurde)
Genau warum funktioniert es nicht?
Es scheint, als ob ein Implementierungsdetail entweicht ... Betrachte:
Dies verursacht einen Fehler:
%Vor%Aber das ist nicht:
%Vor%Und das auch nicht:
%Vor% Die eindeutige Schlussfolgerung ist, dass in der .ToList()
Implementierung, die diese Ausnahme verursacht, eine Art von Optimierung durchgeführt wird.
Nachtrag:
Das funktioniert auch:
%Vor%oder
%Vor%Nur wenn die ursprünglichen Daten ein Array sind, funktioniert es nicht.
In diesem Fall funktioniert es nicht, weil Cast
zuerst die folgende Überprüfung durchführt:
Es stellt sich heraus, dass für int[]
diese Überprüfung erfolgreich ist (also int[]
als IEnumerable<Test>
ist nicht null). Im Ergebnis führt Cast
tatsächlich gar nichts aus, es gibt das Array unverändert zurück. Wenn Sie dann ToArray
aufrufen, wird Array.Copy
aufgerufen. Es versucht, von int[]
array nach Test[]
array zu kopieren und schlägt fehl, weil der Typ nicht übereinstimmt. Diese Ausnahme siehst du.
Weil die Besetzung tatsächlich nichts getan hat, da sie denkt, dass die Sammlung bereits der Wunschtyp ist
%Vor% Wie Sie sehen können, ist die Besetzung IEnumerable
eigentlich nur das ursprüngliche Array. Daher versucht .ToArray
etwas Ähnliches wie (Test[]) data.ToArray();
Tags und Links .net c# linq ienumerable