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>
Но это не представляется возможным.
У кого-нибудь есть объяснение, почему это так?
IService<T>
есть методvoid Foo(T x)
. Если бы вы могли преобразоватьIService<ModelA>
вIService<object>
, то теперь вы можете вызыватьFoo
с любым объектом. Это не может работать. - person Charles Mager   schedule 22.02.2019