Pregunta

Me gustaría crear una matriz de rango de valores dentro de un ArrayList, pero estoy consiguiendo el error "Al menos un elemento en la matriz de origen no pudo ser arrojado a la destinación tipo de matriz".

¿Por qué deberían los siguientes fallar, y lo haría en su lugar?

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

Solución

Este es un error conocido en .NET 1.1, y se ha fijado en el .NET 2.0.

El comportamiento de GetRange se rompe en esta versión. Si intenta listar el contenido del valor de retorno mediante el ToArray sin parámetros () de la instancia de ArrayList envoltorio devuelto por GetRange, verá que contiene referencias nulas y otros valores inconsistentes.

Ver mensajes entre diciembre de 2004 aquí y aquí , en el blog del equipo de BCL.

Otros consejos

Esto funciona bien en DotNet 2.0, así que yo sugeriría comenzar comparando el código de Marco desmontado para ver cuál es la diferencia.

En 2,0, llamando ArrayList.Adapter () devuelve un ArrayList.IListWrapper (que hereda de ArrayList), que simplemente se envuelve un IList (en su caso, una matriz de tipo int []). Llamando ToArray en una IListWrapper llama IList.CopyTo en la matriz subyacente.

Obviamente, esto debe ser implementado de manera diferente en 1.1 debido a la forma en que se establece en 2.0, no puede fallar.

Normalmente, esto sólo debería funcionar:

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

Desde GetRange sólo devuelve un nuevo ArrayList.

¿Está seguro de que su ArrayList solo contiene números enteros, y nada más?

No puedo probarlo en .NET 1.1, pero supongo que eso: - el ArrayList contiene elementos que son de algún otro tipo int a continuación. -. ArrayList.Adapter el método es el originador del problema

Además, ¿por qué no inicializar el ArrayList como esto:

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

Si se puede trabajar con matrices, tal vez sólo Array.Copy:

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

Por otra parte, parece que tendrá que crear una matriz y bucle / cast.

(para información, que funciona bien "tal cual" en 2,0 - a pesar de que tendría que utilizar List<int> lugar)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top