通用接口具体类型之间没有隐式引用转换错误

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>'没有隐式引用转换.

我在这里弄错了什么?

Avi*_*ish 4

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)