是否有可能建立以下异构(通用)链表数据类型?自引用泛型类模板
class MyClass<TPrev, TNext>
where TNext : MyClass<TPrev2, TNext2>
where TPrev2 : MyClass<TPrev, TNext>
编辑:注意特别注意未定义的新型TNext2。
EDIT2:...这使得上面的片段非功能为写入。
是否有可能建立以下异构(通用)链表数据类型?自引用泛型类模板
class MyClass<TPrev, TNext>
where TNext : MyClass<TPrev2, TNext2>
where TPrev2 : MyClass<TPrev, TNext>
编辑:注意特别注意未定义的新型TNext2。
EDIT2:...这使得上面的片段非功能为写入。
不,你不能模拟你想要什么。你可以这样做:
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>
,对于某些其他链接类型,并且遇到无限回归。
不,这是不可能的,因为您尚未将TNext2
或TPrev2
定义为类定义的一部分。除非它是一个现有的类型,否则不能拥有这样的泛型参数,或者是类定义中的泛型类型参数。
但是,如果TPrev2
是一个现有的类型,你不能指定一个约束就像你正在尝试做的那样。
看看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...
}
所以基本上这个值本身包含了前一个和下一个的链接。
你试过了吗?你做了什么事? – 2011-02-04 15:11:19
See:http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx – 2011-02-04 15:13:03