1

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

类型参数“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当我尝试传递我提到TListHandler错误时,我认为不可避免地因为Foois a List<ItemBase>and FooItemis 类型ItemBase我将能够做到这一点var handler = new ListHandler<Foo>();

谁能解释为什么我不能这样做或我做错了什么?

4

2 回答 2

4

AListBase<ItemBase>与 a 不同ListBase<FooItem>
特别是,您可以将任何类型添加ItemBaseListBase<ItemBase>.

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

public class ListHandler<TList, TItem> where T : ListBase<TItem> where TItem : ItemBase { }
于 2012-10-29T15:21:24.543 回答
0

您需要提供项目类型的类型参数,而不是列表类型。为了澄清这一点,请尝试扩展ListHandler类以包含一个AddItemItemBase项目添加到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());
于 2012-10-29T16:02:29.523 回答