C# 如何将子类分配给非泛型类中的泛型字段
在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?
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;
}