通用类型参数错误

时间:2015-09-15 11:17:20

标签: c# generics

我有这3个抽象类:

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>中。没有隐含的   引用从CustomerBusinessObject转换为   BusinessObject<DataObject>

我做错了什么?

3 个答案:

答案 0 :(得分:2)

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

您可以CustomerBusinessObject继承BusinessObject<DataObject>但是在实施中始终使用CustomerDataObject吗?这样可以解决这个错误,但可能不是你想要的。

public class CustomerBusinessObject : BusinessObject<DataObject> { }

答案 1 :(得分:2)

对于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>
{}

这样您就可以指定继承自CustomerDataObject的{​​{1}},这正是您在第一时间的意思

答案 2 :(得分:1)

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

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