почему C # convertall требует 2 параметра - PullRequest
3 голосов
/ 28 июня 2010

У меня есть массив объектов Car

Я хочу преобразовать их в список объектов Vehicle

Я думал, что это будет работать

Vehicle[] vehicles = cars.ConvertAll(car=> ConvertToVehicle(car)).ToArray();

, но его жалобычто ConvertAll требует два параметра.

здесь есть ошибка:

Ошибка 2 При использовании универсального метода System.Array.ConvertAll (TInput [], System.Converter) 'require'Аргументы типа 2 'C: \ svncheckout \ latestTrunk \ Utility \ test.cs 229 33

Использую ли я здесь неправильный метод?

Ответы [ 4 ]

4 голосов
/ 28 июня 2010

Вы используете ConvertAll для Array автомобилей (Car []) вместо List автомобилей (List), который действительно требует двух параметров типа 1.Если автомобили есть в списке, ваш код будет работать.

1 голос
/ 28 июня 2010

Хотя Array.ConvertAll предшествует таким вещам, как методы расширения, ваше ожидаемое поведение точно как Select работает:

Vehicle[] vehicles = cars.Select(car=> ConvertToVehicle(car)).ToArray();

против

Vehicle[] vehicles = Array.ConvertAll(cars, car=> ConvertToVehicle(car));

Различия:

  • Enumerable.Select, хотя и статический, является методом расширения, поэтому представляется методом экземпляра
  • Array.ConvertAll является статическим, но не метод расширения
  • Enumerable.Select возвращает IEnumerable<T>, поэтому вам нужно Enumerable.ToArray, чтобы получить массив
  • Array.ConvertAll уже возвращает массив,и дополнительно гарантирует, что это правильный размер гораздо эффективнее, чем Enumerable.ToArray может
1 голос
/ 28 июня 2010

Это статическая функция, написанная до введения методов расширения, поэтому ее нельзя вызывать как метод.

Правильный синтаксис:

Array.ConvertAll<Vehicle>(cars, car=> ConvertToVehicle(car))
0 голосов
/ 28 июня 2010

Если Car является подтипом транспортного средства Super Type, вы можете сделать следующее. Это должно работать одинаково хорошо, если ConvertToVehicle возвращает тип транспортного средства.

...