Considérez cet exemple artificiel et trivial :
var foo = new byte[] {246, 127};
var bar = foo.Cast<sbyte>();
var baz = new List<sbyte>();
foreach (var sb in bar)
{
baz.Add(sb);
}
foreach (var sb in baz)
{
Console.WriteLine(sb);
}
Grâce à la magie du complément à deux, -10 et 127 sont imprimés sur la console. Jusqu'ici tout va bien. Les personnes aux yeux aiguisés verront que je suis en train d'itérer sur un énumérable et de l'ajouter à une liste. Cela ressemble à ToList
:
var foo = new byte[] {246, 127};
var bar = foo.Cast<sbyte>();
var baz = bar.ToList();
//Nothing to see here
foreach (var sb in baz)
{
Console.WriteLine(sb);
}
Sauf que cela ne fonctionne pas. J'obtiens cette exception :
Type d'exception : System.ArrayTypeMismatchException
Message : Le type de tableau source ne peut pas être assigné au type de tableau de destination.
Je trouve cette exception très particulière car
-
ArrayTypeMismatchException
- Je ne fais rien avec les tableaux, moi-même. Il semble s'agir d'une exception interne. - El
Cast<sbyte>
fonctionne bien (comme dans le premier exemple), c'est lorsque l'on utiliseToArray
oToList
le problème se présente.
Je vise .NET v4 x86, mais le même problème se produit en 3.5.
Je n'ai pas besoin de conseils sur la manière de résoudre le problème, j'y suis déjà parvenu. Ce que je veux savoir, c'est pourquoi ce comportement se produit en premier lieu ?
EDITAR :
Encore plus étrange, l'ajout d'une instruction de sélection sans signification provoque le déclenchement de la fonction ToList
pour fonctionner correctement :
var baz = bar.Select(x => x).ToList();