2011-02-04 36 views
1

是否有可能建立以下异构(通用)链表数据类型?自引用泛型类模板

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

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

EDIT2:...这使得上面的片段非功能为写入。

+1

你试过了吗?你做了什么事? – 2011-02-04 15:11:19

+3

See:http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx – 2011-02-04 15:13:03

回答

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>,对于某些其他链接类型,并且遇到无限回归。

0

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

但是,如果TPrev2是一个现有的类型,你不能指定一个约束就像你正在尝试做的那样。

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... 
} 

所以基本上这个值本身包含了前一个和下一个的链接。