我有一个带有类约束的泛型类。
public class MyContainer<T> where T : MyBaseRow
MyBaseRow是一个抽象类,我也希望包含一些MyContainer的成员。
public abstract class MyBaseRow
{
public MyContainer<MyBaseRow> ParentContainer;
public MyBaseRow(MyContainer<MyBaseRow> parentContainer)
{
ParentContainer = parentContainer;
}
}
我遇到了从MyBaseRow继承的类的构造函数的问题,例如。
public class MyInheritedRowA : MyBaseRow
{
public MyInheritedRowA(MyContainer<MyInheritedRowA> parentContainer)
: base(parentContainer)
{ }
}
在构造函数中不允许MyInheritedRowA,编译器只期望并且只允许MyBaseRow。我认为泛型类约束允许继承?我在这里做错了什么,有什么方法可以重新设计这些类来解决这个问题吗? 非常感谢任何回复。
答案 0 :(得分:4)
基本上,你不能以这种方式使用泛型,因为协方差系统不能以类的方式工作。见这里:http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx
你可以然后使用这样的界面:
public interface MyContainer<out T> where T : MyBaseRow {
}
该代码将编译。
答案 1 :(得分:2)
您可以创建协变通用接口(C#4.0):
public interface IContainer<out T> where T : MyBaseRow
{
}
public class MyContainer<T> : IContainer<T> where T : MyBaseRow
{
}
public abstract class MyBaseRow
{
public IContainer<MyBaseRow> ParentContainer;
public MyBaseRow(IContainer<MyBaseRow> parentContainer)
{
ParentContainer = parentContainer;
}
}
public class MyInheritedRowA : MyBaseRow
{
public MyInheritedRowA(IContainer<MyInheritedRowA> parentContainer)
: base(parentContainer)
{ }
}