泛型类型参数错误

本文关键字:错误 泛型类型参数 | 更新日期: 2023-09-27 18:12:44

我有这三个抽象类:

public abstract class DataObject {}
public abstract class BusinessObject<T> where T : DataObject {}
public abstract class UIObject<T> where T : BusinessObject<DataObject> {}

我能够创建一个CustomerDataObject派生自DataObject,一个CustomerBusinessObject派生自BusinessObject<CustomerDataObject>,但我不能创建CustomerUIObject类:

类型CustomerBusinessObject不能作为类型参数T在泛型类型或方法UIObject<T>中。没有隐含的从CustomerBusinessObjectBusinessObject<DataObject> .

我做错了什么?

泛型类型参数错误

对于Why -您已经知道

现在有一种方法可以做到-不改变逻辑:

可以添加double约束:

public abstract class DataObject {}
public abstract class BusinessObject<T> where T : DataObject {}
public abstract class UIObject<T,U> where T : BusinessObject<U> where U:DataObject {}

这样,你显式地告诉编译器U可以是一个从DataObject派生的类型——这正是你的CustomerDataObject

但是你需要添加:

class CustomerDataObject:DataObject
{}
class CustomerBusinessObject :BusinessObject<CustomerDataObject>
{}
class CustomerUIObject :UIObject<CustomerBusinessObject,CustomerDataObject>
{}

这样你就指定了从DataObject继承的CustomerDataObject这正是你在第一个位置的意思

您明确表示UIObject的T继承BusinessObject<DataObject>,但您的类型CustomerBusinessObject实际上继承了BusinessObject<CustomerDataObject>,这是另一种类型。

你可以让CustomerBusinessObject继承BusinessObject<DataObject>,但在实现中总是使用CustomerDataObject吗?这将修复此错误,但可能不是您想要的。

public class CustomerBusinessObject : BusinessObject<DataObject> { }

你必须使用泛型约束来解决这个问题。

public abstract class UIObject<T,U> where T : BusinessObject<U>