传递接口集合
假设您有以下课程:
class Car : IPainting { ... }
然后像这样的函数:
void AddCars(IEnumerable 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的集合,但它是’painting’数组的组成部分。
我知道C#4.0可能会为此提供解决方案。 今天有没有解决方法呢?
谢谢,
阿尔贝托
C#4将不允许您编写的代码,因为AddCars
方法需要一个实现IPainting
的IEnumerable
。 这并不意味着你可以通过任何实现IPainting
类(例如你可以有一个class Bike : IPainting
与Car
类无关。但是,它允许相反的方式;如果你有void AddCars(IEnumerable
您可以将List
传递给该方法。
在此之前,您需要坚持将Car
序列传递给方法,方法是使用一些转换机制(例如在其他答案中建议使用painting.Cast
)。
尝试使用通用方法:
void AddCars(IEnumerable collection) where T : IPainting
如何使用Linq: AddCars(paintings.Cast
您的代码存在根本缺陷。 您的class级保证所有汽车都实施IPainting,但不能保证所有的汽车都是汽车。
你可以用一些铸件来完成这项工作,但我认为你应该重新考虑你的设计。
AddCars(new Car[] { bmw, mercedes });