У меня хорошее понимание ООП в целом, наследования и полиморфизма, интерфейсов и т. Д. Я столкнулся со странной ситуацией и не понимаю, почему она вообще не работает ...
РЕДАКТИРОВАТЬ: Хорошо, я обнаружил, что ковариация (или контравариантность?) Может решить эту проблему, но принципиально
мы все еще используем .NET 2.0
Как я могу решить эту проблему, не переходя на C # 4.0?
Вот ситуация. Учитывая эти два класса:
public class CustomCollectionType<T> : IEnumerable<T>
{
/* Implementation here, not really important */
}
public class Entity : EntityBase
{
/* Implentation here, not important */
}
Компилятор жалуется, когда я пытаюсь использовать этот общий метод
public void LoopThrough(IEnumerable<EntityBase> entityList)
{
foreach(EntityBase entity in entityList)
{
DoSomething(entity);
}
}
И попробуйте использовать это так:
CustomCollectionType<Entity> entityList;
/* Add items to list */
LoopThrough(entityList);
Ошибка говорит, что я не могу конвертировать из CustomCollectionType<Entity>
в IEnumerable<EntityBase>
.
Однако я могу сделать это:
public void Foo(EntityBase entity)
{
entity.DoSomething();
}
Foo(new Entity());
А это:
public void Bar(IEnumerable<Entity> entityList)
{ ... }
CustomCollectionType<Entity> entityList;
Bar(entityList);
Почему я не могу создать свой метод с самыми высокими классами в иерархии? Типы, очевидно, совместимы ... Я что-то упустил?
РЕДАКТИРОВАТЬ: Я хочу решить эту проблему без каких-либо изменений существующих классов, поэтому о создании нового метода в любом из классов или реализации дополнительного интерфейса не может быть и речи.