Aun*_*Aun 6 c# generics interface
我使用Unity来解析实现该接口的具体类型的通用接口:
_container.RegisterType<IItemLocatorFactory<Job, ILocatorViewModel<Job>>,
ItemLocatorFactory<Job, BaseJobViewModel>>();
Run Code Online (Sandbox Code Playgroud)
声明IItemLocatorFactory<Job, ILocatorViewModel<Job>>是:
public interface IItemLocatorFactory<TData, TModel>
where TData : IMyEntity
where TModel : ILocatorViewModel<TData>
Run Code Online (Sandbox Code Playgroud)
该类ItemLocatorFactory<Job, BaseJobViewModel>实现了接口IItemLocatorFactory<Job, ILocatorViewModel<Job>:
public class ItemLocatorFactory<T, TModel> : IItemLocatorFactory<T, TModel>
where T : IMyEntity
where TModel : ILocatorViewModel<T>
Run Code Online (Sandbox Code Playgroud)
该类BaseJobViewModel声明如下:
public class BaseJobViewModel : ILocatorViewModel<Job>
Run Code Online (Sandbox Code Playgroud)
但这给了我编译错误抱怨没有隐式引用转换:
错误1类型'UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory.ItemLocatorFactory'不能在泛型类型或方法'Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType(Microsoft.Practices.Unity.IUnityContainer,params)中用作类型参数'TTo'. Microsoft.Practices.Unity.InjectionMember [])".从'UI.ItemLocator.Infrastructure.DefaultItemLocatorFactory.ItemLocatorFactory'到'Interfaces.UI.ItemLocator.IItemLocatorFactory>'没有隐式引用转换.
我在这里弄错了什么?
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 */
}
Run Code Online (Sandbox Code Playgroud)