简体   繁体   中英

why does C# convertall require 2 parameters

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM