Wie können IEnumerable.Cast und .ToArray () verwendet werden, um ein int-Array in ein enum-Array zu konvertieren? [Duplikat]

8

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:

%Vor%

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.

    
Matthew Watson 15.12.2016, 16:27
quelle

3 Antworten

8

Sie können .Select(e => (Test)e) verwenden.

    
Daniel A. White 15.12.2016, 16:29
quelle
1

In diesem Fall funktioniert es nicht, weil Cast zuerst die folgende Überprüfung durchführt:

%Vor%

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.

    
Evk 15.12.2016 16:45
quelle
1

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();

zu machen     
Steve 15.12.2016 16:45
quelle

Tags und Links