2014-01-28 2 views
5

Я использую Unity разрешить общий интерфейс для конкретного типа, который реализует этот интерфейс:Нет неявные ошибок ссылочного преобразования между общим интерфейсом конкретного типом

_container.RegisterType<IItemLocatorFactory<Job, ILocatorViewModel<Job>>, 
      ItemLocatorFactory<Job, BaseJobViewModel>>(); 

Декларация IItemLocatorFactory<Job, ILocatorViewModel<Job>> является:

public interface IItemLocatorFactory<TData, TModel> 
    where TData : IMyEntity 
    where TModel : ILocatorViewModel<TData> 

класс ItemLocatorFactory<Job, BaseJobViewModel> реализует интерфейс IItemLocatorFactory<Job, ILocatorViewModel<Job>:

public class ItemLocatorFactory<T, TModel> : IItemLocatorFactory<T, TModel> 
    where T : IMyEntity 
    where TModel : ILocatorViewModel<T> 

Класс BaseJobViewModel объявлен так:

public class BaseJobViewModel : ILocatorViewModel<Job> 

Но это дает мне ошибку компиляции жалуясь, что нет неявного ссылочного преобразования:

Ошибки 1 Типа «UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory .ItemLocatorFactory 'не может использоваться как параметр типа TTo в родовом типе или методе. Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType (Microsoft.Practices.Unity.IUnityContainer, параметры Microsoft.Practices.Unity.InjectionMember [])'. Нет никакого неявного преобразования ссылок из 'UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory.ItemLocatorFactory' в 'Interfaces.UI.ItemLocator.IItemLocatorFactory>'.

Что я здесь не так?

ответ

3

Вы используете другой интерфейс TModel в интерфейсе и реализации.

Это та же самая причина List<Derived> не преобразуемый IList<Base> хотя List<T> является преобразуемым IList<T> и Derived является преобразуемым Base.

Если вы хотите ItemLocatorFactory<T, TModel> быть присваиваемые IItemLocatorFactory<T, TBaseModel> вам нужно сделать интерфейс в TBaseModelковарианты, объявив его out:

public interface IItemLocatorFactory<T, out TModel> 
{ 
    /* use TModel here in a covariant way */ 
} 
Смежные вопросы