我使用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'不能在泛型类型或方法'Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType(Microsoft.Practices.Unity)中用作类型参数'TTo'。 IUnityContainer,params Microsoft.Practices.Unity.InjectionMember [])'。从'UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory.ItemLocatorFactory'到'Interfaces.UI.ItemLocator.IItemLocatorFactory&gt;'没有隐式引用转换。
我在这里弄错了什么?
答案 0 :(得分:3)
您在界面和实现中使用了不同的TModel
。
这与List<Derived>
无法投放到IList<Base>
的原因相同,尽管List<T>
可投放到IList<T>
且Derived
可投放到Base
}。
如果您希望将ItemLocatorFactory<T, TModel>
分配给IItemLocatorFactory<T, TBaseModel>
,则需要通过TBaseModel
声明out
协变:< / p>
public interface IItemLocatorFactory<T, out TModel>
{
/* use TModel here in a covariant way */
}