泛型类型参数错误
本文关键字:错误 泛型类型参数 | 更新日期: 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>
中。没有隐含的从CustomerBusinessObject
到BusinessObject<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>