2010-11-11 183 views
5
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 
} 

基本上C#多态性,我有一个自定义插入函数,它接受一个新的项目和一个列表把它放在,并做了一些“排序”的东西找到一个好地方,把它放在名单。在泛型类型

问题是,我想根据'Base'中的属性来做到这一点,所以最好只有一个函数可以为所有子类型列表执行此操作。

我想我有点想的是:

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

但澄清t等的一些方式:“其中T是一个子类基地”

+1

C#中没有模板。 – dtb 2010-11-11 13:33:48

+0

哪个版本? C#4和.NET 4有办法做到这一点。以前的版本没有。 – 2010-11-11 13:34:09

+2

在这种情况下,.NET 4.0并没有什么帮助,因为'LinkedList '既不是协变也不是逆变。通常,您需要泛型类型为“只读”(例如'IEnumerable ')或“只写”(例如'Action ')以允许协变或逆变。 – stevemegson 2010-11-11 13:45:25

回答

0

您可以使用其中关键字以相同的方式并且您不需要泛型类型。

这里是IComparable实现这可能是你可以寻找一个经典的排序问题:

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

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

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

将允许你打电话AddNewBaseLinkedList<Sub>