泛型类型中的C#多态

时间:2010-11-11 13:31:05

标签: c# generics polymorphism

class Base
{}

class Sub : Base
{}


void AddNewBase(Base t, LinkedList<Base> list){ ... }
...
{

    Sub asub = new Sub();

    LinkedList<Sub> asubList = new LinkedList<Sub>();
    AddNewBase(asub,asubList) // doesn't work
}
基本上,我有一个自定义插入函数,它接受一个新项目和一个列表来放入它,它会做一些“排序”的东西来找到一个把它放在列表中的好地方。

问题是,我想基于'Base'中的属性这样做,所以只有一个函数可以为所有子类型列表执行此操作。

我认为我想要的是:

static void AddNewBase<T>(T t, LinkedList<T> list){ ... }

但有一些澄清T的方式:'其中T是Base的子类'

3 个答案:

答案 0 :(得分:9)

您可以声明Constraints on Type Parameters

static void AddNewBase<T>(T t, LinkedList<T> list) where T : Base { ... }

答案 1 :(得分:0)

您可以以相同的方式使用 where 关键字,而不需要通用类型。

以下是IComparable实现,这可能是您在经典排序问题中寻找的内容:

    static void AddNewBase<T>(T t, LinkedList<T> list) where T : IComparable
    {
        //
    }

答案 2 :(得分:0)

在C#4中,您可以使用协方差来完成这项工作。您必须从其中一个协变通用集合接口中进行选择。例如,将您的方法重新声明为:

static void AddNewBase(Base t, IEnumerable<Base> list) { //... }

允许您使用AddNewBase致电LinkedList<Sub>