Код: Выделить всё
class Animal {}
class Dog : Animal {}
interface IMyContainer {
T Get(int i);
void Add (T thing);
}
class MyList : IMyContainer {
private List items = new List();
public T Get(int i) { return items[i]; }
public void Add(T item) { items.Add(item); }
}
public static void Main(string[] args)
{
IMyContainer dogs = new MyList();
// Why doesn't this cast dogs to animals?
IMyContainer animals = dogs;
animals.Add(new Animal());
Animal retrievedAnimal = animals.Get(0);
animals.Add(new Dog());
}
Мой вопрос: почему компилятор просто не приводит объект собаки к IMyContainer, когда ссылка изменена? Для меня это имеет логический смысл, и с этого момента ссылка соответствующим образом указывает на объект правильного типа, и мы можем свободно добавлять и удалять любые Animal из нашего контейнера. Кажется, что все проблемы с типами возникают, когда мы используем ссылку для ссылки на объект, который является подмножеством ссылочного типа, но не равен ему. Неужели компилятор не может сделать такой вывод неявно?
Подробнее здесь: https://stackoverflow.com/questions/792 ... implicitly