gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:16:47 24 4
gpt4 key购买 nike

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

这是问题的一个例子:

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;
}
}

最佳答案

那是因为你试图分配一个更派生的类型 Data<T>到基本类型 Data<BaseModel> ,这在泛型类中是不允许的。

你有两个选择:

1- 制作 DataConsumer通用:

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

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

2- 或者,生成 Data一个接口(interface)而不是一个类并标记T使用 out 作为协变 类型关键词:

interface IData<out T> where T : BaseModel { }

class DataConsumer
{
private IData<BaseModel> data;

public void Set<T>(IData<T> data) where T : BaseModel
{
this.data = data;
}
}

阅读更多关于 Covariance and Contravariance in Generics here 的信息

关于c# - 如何将子类分配给非泛型类中的泛型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34051451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com