C# 如何将子类分配给非泛型类中的泛型字段

C# 如何将子类分配给非泛型类中的泛型字段,c#,generics,inheritance,C#,Generics,Inheritance,在C#中,我试图将私有泛型变量存储在通过泛型方法传入的非泛型类中。 泛型方法应该接受向上转换为基类类型的子类 以下是问题的一个例子: class BaseModel { } class DerivedModel : BaseModel { } class Data<T> where T : BaseModel { } // Class is NOT generic class DataConsumer { // How do I set this to generic?

在C#中,我试图将私有泛型变量存储在通过泛型方法传入的非泛型类中。 泛型方法应该接受向上转换为基类类型的子类

以下是问题的一个例子:

class BaseModel { }
class DerivedModel : BaseModel { }

class Data<T> where T : BaseModel { }

// Class is NOT generic
class DataConsumer
{
    // How do I set this to generic?
    private Data<BaseModel> data;

    public void Set<T>(Data<T> data) where T : BaseModel
    {
        // Compile time error: 
        // Cannot convert source type 'Generic.Data<T> 
        // to target type 'Generic.Data<Generic.BaseModel>'
        this.data = data;
    }
}
classbasemodel{}
类DerivedModel:BaseModel{}
类数据,其中T:BaseModel{}
//类不是泛型的
类数据消费者
{
//如何将其设置为通用?
私人数据;
公共无效集(数据),其中T:BaseModel
{
//编译时错误:
//无法转换源类型“Generic.Data”
//到目标类型“Generic.Data”
这个数据=数据;
}
}

这是因为您试图将更派生的类型
Data
分配给基类型
Data
,这在泛型类中是不允许的

您有两个选择:

1-使
DataConsumer
通用:

class DataConsumer<T> where T : BaseModel
{
    private Data<T> data;

    public void Set(Data<T> data)
    {
        this.data = data;
    }
}

阅读有关此的详细信息。

数据的类型为
数据
,而函数参数
数据的类型为
数据

您的示例首先有点违背泛型的全部目的,但是您可以将
Set()
方法声明为非泛型方法,并强制客户机执行强制转换

private Data<BaseModel> data;

public void Set(Data<BaseModel> data)
{
  this.data = data;
}
私有数据;
公共无效集(数据)
{
这个数据=数据;
}

作为旁注,如果您声明所有涉及的实体都是泛型的,那么该约束只允许您通过
BaseModel
的契约来操作对象,因此,我看不出显式强制转换有何必要。

我们特别不希望将
DataConsumer
设置为泛型,因为它将有许多不同的泛型方法
private Data<BaseModel> data;

public void Set(Data<BaseModel> data)
{
  this.data = data;
}