c# - 通用接口(interface)具体类型之间没有隐式引用转换错误

标签 c# generics interface

我正在使用 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/

相关文章:

c# - 重新加载后图片框丢失绘图

c# - 删除被调用的查询异常 C#

Java 域模型 : categories with specific subcategories

ios - 如何获得枚举案例的值(value)?

go - 将结构转换为 slice 结构

java - Java Class.forName 的问题

c# - 是::用于 "global::"以外的任何内容

c# - 如何在C#中禁用鼠标点击

c# - 获取从 C# 中的 List<T> 派生的列表中的元素类型

php - Laravel 接口(interface)