why does C# convertall require 2 parameters

2.3k Views Asked by At

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?

4

There are 4 best solutions below

2
On BEST ANSWER

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.

0
On

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
On

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))
0
On

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