我正在使用 Unity 将通用接口(interface)解析为实现该接口(interface)的具体类型:
_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>
类(class)ItemLocatorFactory<Job, BaseJobViewModel>
实现接口(interface) IItemLocatorFactory<Job, ILocatorViewModel<Job>
:
public class ItemLocatorFactory<T, TModel> : IItemLocatorFactory<T, TModel>
where T : IMyEntity
where TModel : ILocatorViewModel<T>
类(class)BaseJobViewModel
声明如下:
public class BaseJobViewModel : ILocatorViewModel<Job>
但这给了我编译错误,提示没有隐式引用转换:
Error 1 The type 'UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory.ItemLocatorFactory' cannot be used as type parameter 'TTo' in the generic type or method 'Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType(Microsoft.Practices.Unity.IUnityContainer, params Microsoft.Practices.Unity.InjectionMember[])'. There is no implicit reference conversion from 'UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory.ItemLocatorFactory' to 'Interfaces.UI.ItemLocator.IItemLocatorFactory>'.
我在这里弄错了什么?
最佳答案
您正在使用不同的 TModel
在接口(interface)和实现中。
这个道理是一样的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 */
}
关于c# - 通用接口(interface)具体类型之间没有隐式引用转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21400218/