是否有可能建立以下異構(通用)鏈表數據類型?自引用泛型類模板
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