Pourquoi ne peut-DotNet 1.1 jeté vers le bas après ArrayList.GetRange?

voix
3

Je voudrais créer un tableau de plage de valeurs dans un ArrayList mais je reçois l'erreur « Au moins un élément du tableau source ne peut pas être jeté sur le type de tableau de destination ».

Pourquoi ne pas les éléments suivants, et que feriez-vous à la place?

int[] ints = new int[] { 1, 2, 3 };
ArrayList list = ArrayList.Adapter(ints);
int[] mints = (int[])list.GetRange(0, 2).ToArray(typeof(int));
Créé 19/02/2009 à 22:44
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
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 devrez créer un tableau et boucle / cast.

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

Créé 19/02/2009 à 22:54
source utilisateur

voix
0

Cela fonctionne très bien dans DotNet 2.0, je vous conseille donc de commencer en comparant le code-cadre désassemblé pour voir ce que la différence est.

En 2.0, appelant ArrayList.Adapter () retourne un ArrayList.IListWrapper (qui hérite de ArrayList) qui enveloppe simplement un IList (dans votre cas, un tableau de type int []). Appel ToArray sur un appel IListWrapper IList.CopyTo sur le tableau sous-jacent.

Il est évident que cela doit être mis en œuvre différemment 1.1 parce que la façon dont il est mis en place dans la version 2.0, il ne peut manquer.

Créé 19/02/2009 à 23:12
source utilisateur

voix
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 tout entiers, et rien d'autre?

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

De plus, pourquoi ne pas initialiser le ArrayList comme ceci:

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

?

Créé 19/02/2009 à 23:13
source utilisateur

voix
3

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

Le comportement de GetRange est cassé dans cette version. Si vous essayez de lister le contenu de la valeur de retour à l'aide du ToArray parameterless () pour l'instance d'emballage ArrayList retourné par GetRange, vous verrez qu'il contient des références et d'autres valeurs incohérentes nulles.

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

Créé 21/02/2009 à 06:10
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more