2009-02-19 7 views
3

Je souhaite créer un tableau à partir d'une plage de valeurs dans une ArrayList mais j'obtiens l'erreur "Au moins un élément du tableau source n'a pas pu être redéfini au type de tableau de destination". Pourquoi les échecs suivants devraient-ils échouer, et que feriez-vous à la place?Pourquoi dotnet 1.1 ne peut-il pas tomber après ArrayList.GetRange?

int[] ints = new int[] { 1, 2, 3 }; 
ArrayList list = ArrayList.Adapter(ints); 
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int)); 
+0

Il fonctionne dans 2.0 –

+0

essayez-le avec un type non valeur (chaînes par exemple) il pourrait y avoir un problème avec la boxe – ShuggyCoUk

Répondre

3

Ceci est un bogue connu dans .NET 1.1, et a été corrigé dans le .NET 2.0.

Le comportement de GetRange est rompu dans cette version. Si vous essayez de répertorier le contenu de la valeur de retour à l'aide de ToArray() sans paramètre pour l'instance d'enveloppe ArrayList renvoyée par GetRange, vous verrez qu'il contient des références null et d'autres valeurs incohérentes.

Voir les messages de Décembre 2004 here et here, dans le blog de l'équipe BCL.

0

Si vous pouvez travailler avec des tableaux, peut-être juste Array.Copy:

int[] ints = new int[] { 1, 2, 3 }; 
    int[] mints = new int[2]; 
    Array.Copy(ints, 0, mints, 0, 2); 

Sinon, il semble que vous aurez à créer un tableau et boucle/cast.

(pour info, il fonctionne très bien « tout comme » le 2.0 - bien que vous utilisez List<int> à la place)

0

Cela fonctionne très bien dans DotNet 2.0, donc je suggère de commencer en comparant le code-cadre démontées pour voir quelle est la différence. Dans la version 2.0, l'appel de ArrayList.Adapter() renvoie un ArrayList.IListWrapper (qui hérite de ArrayList) qui enveloppe simplement un IList (dans notre cas, un tableau de type int []). L'appel de ToArray sur un IListWrapper appelle IList.CopyTo sur le tableau sous-jacent.

De toute évidence, cela doit être implémenté différemment dans la version 1.1, car la façon dont il est configuré en 2.0 ne peut pas échouer.

0

Normalement, cela devrait fonctionner:

(int[])list.GetRange(0, 2).ToArray(typeof(int)); 

Depuis GetRange retourne juste une nouvelle ArrayList.

Etes-vous sûr que votre ArrayList contient uniquement des entiers, et rien d'autre?

Je ne peux pas le tester dans .NET 1.1, mais je suppose que: - votre arraylist contient des éléments qui sont d'un autre type que int. - la méthode ArrayList.Adapter est à l'origine du problème.

Aussi, pourquoi ne pas initialiser le ArrayList comme ceci:

ArrayList l = new ArrayList (new int[] {0, 1, 2, 3, 4, 5}); 

?

+0

Je pense que le point est que le code posté ne devrait pas échouer, et le fait qu'il fait indique une forte possibilité d'exceptions inexplicables dans différentes circonstances. – snarf

Questions connexes