传递接口集合

假设您有以下课程:

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方法需要一个实现IPaintingIEnumerable 。 这并不意味着你可以通过任何实现IPainting类(例如你可以有一个class Bike : IPaintingCar类无关。但是,它允许相反的方式;如果你有void AddCars(IEnumerable collection)您可以将List传递给该方法。

在此之前,您需要坚持将Car序列传递给方法,方法是使用一些转换机制(例如在其他答案中建议使用painting.Cast() )。

尝试使用通用方法:

 void AddCars(IEnumerable collection) where T : IPainting 

如何使用Linq: AddCars(paintings.Cast());

您的代码存在根本缺陷。 您的class级保证所有汽车都实施IPainting,但不能保证所有的汽车都是汽车。

你可以用一些铸件来完成这项工作,但我认为你应该重新考虑你的设计。

 AddCars(new Car[] { bmw, mercedes });