Проблемы контравариантности с вложенными интерфейсами

interface IModel
{ 
}

class ModelA : IModel
{
}

interface IService<T> where T: IModel
{
}

class ServiceA : IService<ModelA>
{
}

Учитывая приведенное выше определение классов и интерфейсов, работает следующее:

IModel model = new ModelA();

Указывает, что ModelA можно привести к своему интерфейсу IModel

Также работает следующее:

IService<ModelA> service1 = new ServiceA();

Указывает, что ServiceA можно привести к своему интерфейсу IService<ModelA>

Однако следующее терпит неудачу:

IService<IModel> service2 = new ServiceA();

В сообщении об ошибке говорится, что ServiceA нельзя неявно преобразовать в IService<IModel>.

Меня это удивило, поскольку:
ModelA можно привести к IModel, а
ServiceA можно привести к IService<IModel>
я ожидал, что произойдет следующее:
ServiceA -> IService<ModelA> -> IService<IModel>

Но это не представляется возможным.

У кого-нибудь есть объяснение, почему это так?


person Arash-s    schedule 22.02.2019    source источник
comment
Учтите, что у IService<T> есть метод void Foo(T x). Если бы вы могли преобразовать IService<ModelA> в IService<object>, то теперь вы можете вызывать Foo с любым объектом. Это не может работать.   -  person Charles Mager    schedule 22.02.2019
comment
@CharlesMager Имеет смысл! Спасибо :)   -  person Arash-s    schedule 22.02.2019


Ответы (1)