首页 > 解决方案 > 由于没有隐式引用转换,不能使用类型作为类型参数

问题描述

我正在尝试构建以下结构。编译器似乎不同意ServiceTicketModel可以隐式转换为Model<IEntity>. 为什么会这样,有什么办法可以绕过它?

public abstract class ModelTest<TModel> where TModel : Model<IEntity>, new()

public abstract class Model<TEntity> where TEntity : IEntity

public class ServiceTicketModel : Model<ServiceTicket>

public class ServiceTicket : Ticket, IEntity


public class ServiceTicketModelTest : ModelTest<ServiceTicketModel>, IDisposable

错误在最后一课,消息是:

The type '...ServiceTicketModel' cannot be used as type parameter 'TModel' in the generic type or method 'ModelTest<TModel>'. There is no implicit reference conversion from '...ServiceTicketModel' to '...Model<IEntity>'

标签: c#generics

解决方案


编译器是正确的......您需要子类Model<IEntity>化以满足where您添加的约束TModel,但您没有 - 您子类化Model<ServiceTicket>where ServiceTicket : IEntity。这不一样。

如果这是一个接口或委托定义,您有时可以使用变体修饰符 ( in/ out) 使其满意。但是你不能用类来做到这一点。

您可能需要使用:

public abstract class ModelTest<TModel, TEntity>
    where TModel : Model<TEntity>, new()
    where TEntity : IEntity
{...}
public class ServiceTicketModelTest
    : ModelTest<ServiceTicketModel, ServiceTicket>
    , IDisposable
{...}

推荐阅读