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

时间:2014-01-28 08:18:45

标签: c# generics interface

我使用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;'没有隐式引用转换。

我在这里弄错了什么?

1 个答案:

答案 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 */
}