开发者

why does C# convertall require 2 parameters

开发者 https://www.devze.com 2023-01-04 18:21 出处:网络
I have an array of Car objects I want to conver them to a list of Vehicle objects I thought this would work

I have an array of Car objects

I want to conver them to a list of Vehicle objects

I thought this would work

Vehicle[] vehicles = cars.ConvertAll(car=> ConvertToVehicle(开发者_运维百科car)).ToArray();

but its complaining that ConvertAll requires two parameters.

here is the error:

Error 2 Using the generic method 'System.Array.ConvertAll(TInput[], System.Converter)' requires '2' type arguments C:\svncheckout\latestTrunk\Utility\test.cs 229 33

am i using the wrong method here?


You're using ConvertAll on an Array of cars (Car[]) instead of a List of cars (List) which does indeed require two type parameters1. If cars is a list your code will work.


That's a static function, written before extension methods were introduced, so you can't call it like a method.

Correct syntax:

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


While Array.ConvertAll pre-dates things like extension methods, your expected behaviour is exactly how Select works:

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

vs

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

Differences:

  • Enumerable.Select, while static, is an extension method - so appears to be an instance method
  • Array.ConvertAll is static but isn't an extension method
  • Enumerable.Select returns an IEnumerable<T>, so you need Enumerable.ToArray to get an array
  • Array.ConvertAll returns an array already, and additionally ensures it is the right size much more efficiently than Enumerable.ToArray can


If Car is a Sub Type of Vehicle Super Type you can do the following.It should work equally well if ConvertToVehicle returns a Vehicle type.

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

精彩评论

暂无评论...
验证码 换一张
取 消