传递接口集合

abe*_*nci 5 c# generics collections interface

假设您有以下课程:

class Car : IPainting
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

然后像这样的函数:

void AddCars(IEnumerable<Car> collection)
Run Code Online (Sandbox Code Playgroud)

然后像这样的代码片段:

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
Run Code Online (Sandbox Code Playgroud)

这当然不能编译,因为AddCars()方法只接受Cars的集合,但它是'painting'数组的组成部分.

我知道C#4.0可能会为此提供解决方案.今天有没有解决方法呢?

谢谢,

阿尔贝托

Nic*_*ver 8

尝试使用通用方法:

void AddCars<T>(IEnumerable<T> collection) where T : IPainting
Run Code Online (Sandbox Code Playgroud)


Fre*_*örk 3

C# 4 不允许您编写的代码,因为该方法AddCars需要IEnumerable<Car>实现IPainting. 这并不意味着您可以传递任何类实现IPainting(例如,您可以有一个class Bike : IPainting与该类无关的a Car)。但是,它将允许相反的方式;如果有,void AddCars(IEnumerable<IPainting> collection)您可以将 a 传递List<Car>给该方法。

Car在那之前,您将需要通过使用某种转换机制(例如其他答案中建议的)来坚持将序列传递给该方法painting.Cast<Car>()