I have a few classes:
class Vehicle
{
}
class Car : Vehicle
{
}
I have a list of the derived class:
IList<Car> cars;
I would like to convert the list to its base class, and have tried:
IList<Vehicle> baseList = cars as IList<Vehicle>;
But I always get null
. Also
cars is IList<Vehicle> evaluates to be false.
Granted, I can add the items to a list if I do the following:
List<Vehicle> test = new List<Vehicle> ();
foreach ( Car car in cars )
{
test.Add(car);
}
And I get my list, but I know there has to be a better way. Any thoughts?
Use IEnumerable<T>
.Cast :
IList<Vehicle> vehicles = cars.Cast<Vehicle>().ToList();
Alternatively, you may be able to avoid the conversion to List depending on how you wish to process the source car list.
That sort of polymorphism that lets you cast IList<Car>
to IList<Vehicle>
is unsafe, because it would let you insert a Truck
in your IList<Car>
.
You're facing the problem that there is limited co- and contravariance in C#. There is an interesting approach in C# 4.0, described here at the very ending. However, it creates some other limitations that are related to the truck-problem in the answer from Novelocrat.
Here are a couple of approaches using Linq:
IList<Derived> list = new List<Derived>();
list.Add(new Derived());
IList<Base> otherlist = new List<Base>(from item in list select item as Base);
IList<Base> otherlist2 = new List<Base>(list.Select(item => item as Base));
You can also take a look on Krzysztof's Cwalina article, Simulated Covariance for .NET Generics
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With