为什么C#convertall需要2个参数

时间:2010-06-28 02:42:51

标签: c# linq convertall

我有一个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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

正确的语法:

Array.ConvertAll<Vehicle>(cars, car=> ConvertToVehicle(car))

答案 2 :(得分:1)

虽然Array.ConvertAll预先定义了扩展方法之类的内容,但您的预期行为完全 Select的工作方式:

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

VS

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

的差异:

  • Enumerable.Select,而static是一种扩展方法 - 因此出现作为实例方法
  • Array.ConvertAll是静态的,但不是扩展方法
  • Enumerable.Select返回IEnumerable<T>,因此您需要Enumerable.ToArray才能获得数组
  • Array.ConvertAll已经返回一个数组,另外确保它的大小比Enumerable.ToArray
  • 更有效

答案 3 :(得分:0)

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

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();
    }
}