从具有类型约束的类继承 - “没有来自...的隐式引用转换”

时间:2013-06-28 16:30:34

标签: c# asp.net types type-constraints

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

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&gt;'的隐式引用转换。

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

1 个答案:

答案 0 :(得分: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>> { }

A中的Bar A中的Foo相同。相反,List<A>A的定义中扮演Foo<A> Bar<A>的角色。