Tenir compte de la déclaration enum suivante et tableau int:Comment utiliser IEnumerable.Cast <> et .ToArray() pour convertir un tableau int en un tableau enum?
enum Test { None };
int[] data = {0};
Pour convertir ce tableau int[]
à un tableau Test[]
nous pouvons simplement faire ceci:
Test[] result = Array.ConvertAll(data, element => (Test)element);
J'ai d'abord essayé de le faire:
Test[] result = data.Cast<Test>().ToArray();
Cependant, cela déclenche une exception lors de l'exécution:
System.ArrayTypeMismatchException: Source array type cannot be assigned to destination array type.
Question Un
Est-il possible de le faire en utilisant LINQ et Cast<>
sans erreur, ou dois-je simplement utiliser Array.Convert()
?
Question Deux (ajouté après la première question a été répondu correctement)
Exactement pourquoi ça ne marche pas?
Il semble que c'est un cas d'un détail de mise en œuvre s'échapper ... Considérez:
Cela provoque une erreur:
var result = data.Cast<Test>().ToList(); // Happens with "ToList()" too.
Mais cela ne veut pas:
var result = new List<Test>();
foreach (var item in data.Cast<Test>())
result.Add(item);
Et ni est-ce que:
var result = data.Select(x => x).Cast<Test>().ToList();
L'implication claire est qu'une sorte d'optimisation est en cours dans l'implémentation .ToList()
qui provoque cette exception.
Addendum:
Cela fonctionne aussi:
List<int> data = new List<int>{0};
var result = data.Cast<Test>().ToList();
ou
List<int> data = new List<int>{0};
var result = data.Cast<Test>().ToArray();
Il est seulement si les données d'origine est un tableau qui ne fonctionne pas.
Pourquoi? 'Array.ConvertAll' fonctionne et est plus efficace –
@TimSchmelter Je suppose que c'est vraiment une question académique. –
Et maintenant je suis devenu très intéressé par pourquoi cela ne fonctionne pas ... :) –