Предположим, что у Вас есть следующий класс:
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 () метод принимает только набор Автомобилей, но это - то, из чего сделан массив 'рисования'.
Я знаю, что C# 4.0, вероятно, предоставит решение для этого. Есть ли какое-либо обходное решение сегодня для него?
Спасибо,
Alberto
C # 4 не разрешит код, который вы написали, поскольку метод AddCars
ожидает IEnumerable
, который реализует IPainting
. Это не означает, что вы можете передать любой класс, реализующий IPainting
(например, вы можете иметь класс Bike: IPainting
, который не имеет ничего общего с ] Car
как бы то ни было. Однако он позволит и наоборот; если у вас есть void AddCars (IEnumerable
, вы можете передать List
к методу.
До тех пор вам нужно будет придерживаться передачи Car
последовательностей в метод, используя некоторый механизм приведения (например, painting.Cast
] предложено в других ответах).
Попробуйте использовать универсальный метод:
void AddCars<T>(IEnumerable<T> collection) where T : IPainting
Как насчет использования Linq: AddCars(paintings.Cast
Ваш код принципиально ошибочно. Ваш класс гарантирует, что все автомобили реализуют impainting, но нет никаких гарантий, что все враждающиеся - автомобили.
Вы, скорее всего, сделаете эту работу с каким-либо литейным, но я думаю, что вы должны пересмотреть свой дизайн.
AddCars(new Car[] { bmw, mercedes });