传递接口集合

时间:2010-01-28 13:52:28

标签: c# generics interface collections

假设您有以下课程:

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可能会为此提供解决方案。今天有没有解决方法呢?

谢谢,

阿尔贝托

4 个答案:

答案 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>())。

相关问题