Почему точка dotnet 1.1 не может быть закрыта после ArrayList.GetRange? - PullRequest
3 голосов
/ 20 февраля 2009

Я хотел бы создать массив из диапазона значений в ArrayList, но получаю сообщение об ошибке «Не удалось преобразовать хотя бы один элемент в исходном массиве в тип целевого массива».

Почему следующее не получится, и что бы вы сделали вместо этого?

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

Ответы [ 4 ]

3 голосов
/ 21 февраля 2009

Это известная ошибка в .NET 1.1, исправленная в .NET 2.0.

Поведение GetRange в этом выпуске нарушено. Если вы попытаетесь перечислить содержимое возвращаемого значения, используя ToArray () без параметров для экземпляра оболочки ArrayList, возвращаемого GetRange, вы увидите, что он содержит нулевые ссылки и другие несовместимые значения.

Смотрите сообщения за декабрь 2004 года здесь и здесь , в блоге команды BCL.

0 голосов
/ 20 февраля 2009

Это отлично работает в DotNet 2.0, поэтому я бы предложил начать со сравнения разобранного кода Framework, чтобы увидеть, в чем разница.

В 2.0 вызов ArrayList.Adapter () возвращает ArrayList.IListWrapper (который наследуется от ArrayList), который просто переносит IList (в вашем случае, массив типа int []). Вызов ToArray для IListWrapper вызывает IList.CopyTo для базового массива.

Очевидно, что это должно быть реализовано по-другому в 1.1, потому что способ, которым он настроен в 2.0, не может дать сбой.

0 голосов
/ 20 февраля 2009

Обычно это должно работать:

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

Поскольку GetRange просто возвращает новый ArrayList.

Вы уверены, что ваш ArrayList содержит только целые числа и ничего больше?

Я не могу проверить это в .NET 1.1, но я полагаю, что: - ваш arraylist содержит элементы, которые имеют некоторый другой тип, чем int. - метод ArrayList.Adapter является источником проблемы.

Кроме того, почему бы вам не инициализировать ArrayList следующим образом:

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

0 голосов
/ 20 февраля 2009

Если вы можете работать с массивами, возможно, просто Array.Copy:

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

Кроме того, похоже, вам придется создать массив и цикл / приведение.

(для информации, он отлично работает "как есть" на 2.0 - хотя вы бы использовали List<int> вместо)

...