3

我有一个 Car 对象数组

我想将它们转换为 Vehicle 对象列表

我以为这行得通

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

但它抱怨 ConvertAll 需要两个参数。

这是错误:

错误 2 使用通用方法 'System.Array.ConvertAll(TInput[], System.Converter)' 需要 '2' 类型参数 C:\svncheckout\latestTrunk\Utility\test.cs 229 33

我在这里使用错误的方法吗?

4

4 回答 4

4

您在汽车数组(Car[]) 上使用 ConvertAll 而不是确实需要两个类型参数1的汽车列表(List) 。如果汽车是列表,则您的代码将起作用。

于 2010-06-28T03:04:14.097 回答
1

那是一个静态函数,是在引入扩展方法之前编写的,所以你不能像方法一样调用它。

正确的语法:

Array.ConvertAll<Vehicle>(cars, car=> ConvertToVehicle(car))
于 2010-06-28T03:12:42.690 回答
1

虽然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有效
于 2010-06-28T05:20:14.197 回答
0

如果 Car 是 Vehicle Super Type 的 Sub Type,您可以执行以下操作。如果 ConvertToVehicle 返回 Vehicle 类型,它应该同样有效。

class Vehicle { }
class Car : Vehicle { }

class Program
{
    static List<Car> ll = new List<Car>();
    static void Main(string[] args)
    {
       Vehicle[] v = ll.ConvertAll<Vehicle>(x => (Vehicle)x).ToArray();
    }
}
于 2010-06-28T02:56:03.600 回答