C# 继承中的逆变

C# 继承中的逆变,c#,entity-framework,generics,contravariance,C#,Entity Framework,Generics,Contravariance,有没有一种方法可以使继承类型中的返回类型逆变?请参见下面的示例代码。我需要这个实体框架 public class InvoiceDetail { public virtual ICollection<Invoice> Invoices { get; set; } } public class SalesInvoiceDetail : InvoiceDetail { //This is not allowed by the compiler, but what we

有没有一种方法可以使继承类型中的返回类型逆变?请参见下面的示例代码。我需要这个实体框架

public class InvoiceDetail
{
    public virtual ICollection<Invoice> Invoices { get; set; }
}

public class SalesInvoiceDetail : InvoiceDetail
{
    //This is not allowed by the compiler, but what we are trying to achieve is that the return type 
    //should be ICollection<SalesInvoice> instead of ICollection<Invoice>
    public override ICollection<SalesInvoice> Invoices { get; set; }
}
公共类发票明细
{
公共虚拟ICollection发票{get;set;}
}
公共类SalesInvoiceDetail:InvoiceDetail
{
//这是编译器不允许的,但我们试图实现的是返回类型
//应为ICollection而不是ICollection
公共覆盖ICollection发票{get;set;}
}

您可以应用带有相应约束的泛型

public abstract class InvoiceDetailBase<T> where T : Invoice
{
    public virtual ICollection<T> Invoices { get; set; }
}

public class InvoiceDetail : InvoiceDetailBase<Invoice>
{
}

public class SalesInvoiceDetail : InvoiceDetailBase<SalesInvoice>
{
}
公共抽象类InvoiceDetailBase其中T:Invoice
{
公共虚拟ICollection发票{get;set;}
}
公共类InvoiceDetail:InvoiceDetailBase
{
}
公共类SalesInvoiceDetail:InvoiceDetailBase
{
}

您可以应用带有相应约束的泛型

public abstract class InvoiceDetailBase<T> where T : Invoice
{
    public virtual ICollection<T> Invoices { get; set; }
}

public class InvoiceDetail : InvoiceDetailBase<Invoice>
{
}

public class SalesInvoiceDetail : InvoiceDetailBase<SalesInvoice>
{
}
公共抽象类InvoiceDetailBase其中T:Invoice
{
公共虚拟ICollection发票{get;set;}
}
公共类InvoiceDetail:InvoiceDetailBase
{
}
公共类SalesInvoiceDetail:InvoiceDetailBase
{
}