由于没有隐式引用转换,因此无法将类型用作类型参数

时间:2019-03-26 10:45:56

标签: c# generics

我正在尝试构建以下结构。编译器似乎不同意将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>'

1 个答案:

答案 0 :(得分:1)

编译器是正确的...您需要子类Model<IEntity>来满足您在where上添加的TModel约束,但是您不能-子类Model<ServiceTicket> 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
{...}