假设您有以下课程:
class Car : IPainting
{
...
}
然后是这样的函数:
void AddCars(IEnumerable<Car> collection)
然后是这样的代码片段:
Car bmw = new Car();
Car mercedes = new Car();
IPainting a = (IPainting) bmw;
IPainting b = (IPainting) mercedes;
IPainting[] paintings = new IPainting[] {a, b};
AddCars(paintings); // fails to compile
这当然不能编译,因为AddCars()方法只接受Cars的集合,但它是“绘画”数组的组成部分。
我知道C#4.0可能会为此提供解决方案。今天有没有解决方法呢?
谢谢,
阿尔贝托
答案 0 :(得分:8)
尝试使用通用方法:
void AddCars<T>(IEnumerable<T> collection) where T : IPainting
答案 1 :(得分:4)
如何使用Linq:AddCars(paintings.Cast<Car>());
答案 2 :(得分:4)
您的代码存在根本缺陷。你的班级保证所有汽车都实施了IPainting,但并不能保证所有的汽车都是汽车。
你可能会用一些演员来完成这项工作,但我认为你应该重新考虑你的设计。
AddCars(new Car[] { bmw, mercedes });
答案 3 :(得分:3)
C#4将不允许您编写的代码,因为方法AddCars
需要IEnumerable<Car>
来实现IPainting
。这并不意味着您可以传递实现IPainting
的任何类(例如,您可以使用与class Bike : IPainting
类无关的Car
。但是,它允许反过来;如果您有void AddCars(IEnumerable<IPainting> collection)
,则可以将List<Car>
传递给该方法。
在此之前,您需要坚持将Car
序列传递给方法,方法是使用一些强制转换机制(例如其他答案中建议的painting.Cast<Car>()
)。