4

我有一个带有类约束的泛型类。

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。我认为通用类约束允许继承?我在这里做错了什么,有什么办法可以重新设计这些类来解决这个问题?非常感谢您的任何回复。

4

2 回答 2

4

基本上,您不能那样使用泛型,因为协方差系统不适用于 classes。见这里: http: //geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx

但是,您可以使用这样的界面:

public interface MyContainer<out T> where T : MyBaseRow {

    }

该代码将编译。

于 2012-08-08T21:48:50.450 回答
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)
    { }
  }
于 2012-08-08T21:54:34.070 回答