无法转换从通用基础继承的对象

时间:2012-10-29 15:19:19

标签: c# generics inheritance

我正在尝试处理更复杂的继承结构和泛型,我正在尝试为当前项目创建一些架构,该项目遵循此诉讼。我目前的问题是我收到此错误:

  

类型参数'Foo'不继承或实现约束类型'ListBase'

  public class ItemBase {}
  public class ListBase<T> where T : ItemBase
  {
    public virtual List<T> ListExample {get; set; }
  }

这些是我的基类,虽然它们可能没有恰当地命名我只是试图展示一个我想要实现的简单示例。

  public class FooItem : ItemBase { }
  public class Foo : ListBase<FooItem>
  {
    public override List<FooItem> ListExample { get; set;}
  }

因此,我可以扩展列表的初始基类,并使用它做更多的事情,但我想要一种处理所有这些类的通用方法。

  public class ListHandler<T> where T : ListBase<ItemBase> { }

当我尝试将Foo作为T传递给ListHandler时,我收到了提到的错误,我认为这不可避免地因为FooList<ItemBase>而且FooItem类型为ItemBase我可以执行此操作var handler = new ListHandler<Foo>();

有人可以解释为什么我不能这样做或者我做错了什么?

2 个答案:

答案 0 :(得分:4)

ListBase<ItemBase>ListBase<FooItem>不同 特别是,您可以将{em>任何类ItemBase添加到ListBase<ItemBase>

您需要接受两个通用参数:

public class ListHandler<TList, TItem> where T : ListBase<TItem> where TItem : ItemBase { }

答案 1 :(得分:0)

您需要提供类型的type参数,而不是列表类型。为了澄清这一点,请尝试扩展ListHandler类以包含AddItem方法,该方法将ItemBase项添加到ListBase实例:

// As is: Won't work, because there is no way to refer to the constructed
// specific type of ItemBase:
public class ListHandler<TList> where TList: ListBase {
    public TList List { get; private set; }
    public ListHandler(TList List) { this.List = List; }
    public void AddItem(T???? item) { List.ListExample.Add(item); }
}

// Corrected: this will work because TItem can be used to constrain
// the constructed ListBase type as well:
public class ListHandler<TItem> where TItem : ItemBase {
    public ListBase<TItem> List { get; private set; }
    public ListHandler(ListBase<TItem> List) { this.List = List; }
    public void AddItem(TItem item) { List.ListExample.Add(item); }
}

// And this will work just fine:
var handler = new ListHandler<FooItem>(new FooList());