Об обобщениях и наследовании (простите за плохой титул)

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

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

У меня есть собственный класс списка, который реализует Generics.

class MyList<T>
{
    public void add(T item) // adds an item to the list
    { /* code */ }
    public void add(MyList<T> list) // attaches an existing list to the end of the current one
    { /* code */ }
}

У меня также есть классы:

class Apple : Fruit

и

class Banana : Fruit

Теперь идет соответствующий код:

MyList<Fruit> fruitList = new MyList<Fruit>();
// fill fruitList

fruitList.add(new Apple()); // works, of course
fruitList.add(new Banana()); // works as well, of course

MyList<Apple> appleList = new MyList<Apple>();
// fill appleList

fruitList.add(appleList); // doesn't work. Why?

Несмотря на то, что appleList - это MyList (от Apple), а Apple - это Fruit, VisualStudio не принимает MyList (от Apple ) в качестве аргумента при запросе MyList (Of Fruit).

Однако, если бы я объявил список так:

MyList<object> fruitList = new MyList<object>();

Тогда все снова заработало. Что именно я сделал не так?

Буду очень признателен за ответ, и спасибо, что нашли время прочитать, даже не отвечая.

10
задан SLaks 26 January 2012 в 19:33
поделиться