Передача Интерфейсного набора

Предположим, что у Вас есть следующий класс:

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

5
задан abenci 28 January 2010 в 13:55
поделиться

4 ответа

C # 4 не разрешит код, который вы написали, поскольку метод AddCars ожидает IEnumerable , который реализует IPainting . Это не означает, что вы можете передать любой класс, реализующий IPainting (например, вы можете иметь класс Bike: IPainting , который не имеет ничего общего с ] Car как бы то ни было. Однако он позволит и наоборот; если у вас есть void AddCars (IEnumerable collection) , вы можете передать List к методу.

До тех пор вам нужно будет придерживаться передачи Car последовательностей в метод, используя некоторый механизм приведения (например, painting.Cast () ] предложено в других ответах).

3
ответ дан 18 December 2019 в 08:28
поделиться

Попробуйте использовать универсальный метод:

void AddCars<T>(IEnumerable<T> collection) where T : IPainting
8
ответ дан 18 December 2019 в 08:28
поделиться

Как насчет использования Linq: AddCars(paintings.Cast());

4
ответ дан 18 December 2019 в 08:28
поделиться

Ваш код принципиально ошибочно. Ваш класс гарантирует, что все автомобили реализуют impainting, но нет никаких гарантий, что все враждающиеся - автомобили.

Вы, скорее всего, сделаете эту работу с каким-либо литейным, но я думаю, что вы должны пересмотреть свой дизайн.

AddCars(new Car[] { bmw, mercedes });
4
ответ дан 18 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: