2011-02-04 71 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... 
} 

所以基本上這個值本身包含了前一個和下一個的鏈接。