自引用泛型类模板

时间:2011-02-04 15:09:01

标签: c# generics

是否可以构建以下异构(通用)链表数据类型?

 class MyClass<TPrev, TNext> 
      where TNext : MyClass<TPrev2, TNext2> 
           where TPrev2 : MyClass<TPrev, TNext>

编辑:特别注意未定义的新类型TNext2。

edit2:...这使得上述代码段无法正常编写。

3 个答案:

答案 0 :(得分:2)

不,你不能建模你想要的。你可以这样做:

class Link<TPrev, TValue, TNext>
{
    public TPrev  Prev { get; set; }
    public TValue Value { get; set; }
    public TNext  Next { get; set; }
}

但你不能这样做:

class Link<???, TValue, ???>
{
    public Link<???> Prev { get; set; }
    public TValue Value { get; set; }
    public Link<???> Next { get; set; }
}

问题在于,如果您声明列表的上一个和下一个元素也必须是某些泛型类型的列表,那么您已尝试定义无限大小的类型。没有办法说,“此后没有下一个节点”,因为对于某些其他链接类型,下一个节点必须是Link<T>,并且您会遇到无限回归。

答案 1 :(得分:0)

不,这是不可能的,因为您没有将TNext2TPrev2定义为类定义的一部分。除非是现有类型,否则不能有类似的泛型参数,或者是类定义中的泛型类型参数。

但是,如果TPrev2是现有类型,则无法像尝试那样指定约束。

答案 2 :(得分:0)

查看this blog entry有关该主题的有趣想法。从本质上讲,你可以这样做:

public abstract class LinkedListBase<T>
    where T : LinkedListBase<T>
{
    public T Next { get; set; }
    public T Previous { get; set; }
}
public class LinkedListImpl : LinkedListBase<LinkedListImpl>
{
    public string Name { get; set; }
    // all of the value properties go here...
}

基本上,值本身包含前一个和下一个的链接。