1

我有一个用于数据绑定单个数据源的基类,如下所示:

public abstract class DataControlBase<TContainer, TDataType> : Control
    where TDataType : new()
    where TContainer : TemplateContainerBase<TDataType>, new()
{
    public TDataType DataSource { get; set; }
}

容器类 (TContainer) 将始终从容器基类继承:

public abstract class TemplateContainerBase<TDataType> : Control
    where TDataType : new()
{
    public TemplateContainerBase() { }

    public TDataType DataItem { get; set; }
}

最后我有一个转发器基地,我将绑定几个数据项作为数据源:

public abstract class RepeaterBase<TContainer, TDataType> : DataControlBase<TContainer, List<TDataType>>
    where TDataType : new()
    where TContainer : TemplateContainerBase<TDataType>, new()
{

}

我在 RepeaterBase 上收到一个错误,说这个

错误 1 ​​类型“TContainer”不能用作泛型类型或方法“WebTestHarness.Controls.DataControlBase”中的类型参数“TContainer”。没有从“TContainer”到“WebTestHarness.Controls.TemplateContainerBase>”的隐式引用转换。

我已经阅读了一些描述类似问题的不同主题,但似乎都与方法有关,而这仅与类设计有关。

4

1 回答 1

2

你有

RepeaterBase<TContainer, TDataType> : DataControlBase<TContainer, List<TDataType>>

因此您List<TDataType>已将Y. DataControlBase<X, Y>但是您的约束DataControlBase要求X : TemplateContainerBase<Y>, new(). 所以,在你的情况下,你需要约束

where TContainer : TemplateContainerBase<List<DataType>>, new()

TContainer,不

where TContainer : TemplateContainerBase<DataType>, new()

正如你目前所拥有的。

也就是说,仅仅因为您在不同的类中为类型参数使用了相同的名称并不意味着当您开始参数化事物时它们代表相同的类型。那是

class Foo<A> { }
class Bar<A> : Foo<List<A>> { }

AinBar与in不同。_ _ 相反,在 的定义中扮演了for的角色。AFooList<A>AFoo<A>Bar<A>

于 2013-06-28T16:35:30.187 回答