2012-11-23 23 views
9

我是新來的泛型,我在實現一個小的自我實踐代碼時遇到了一些麻煩。如何將int值轉換爲與char等效的泛型類型參數?

我在創建一個鏈表。我希望它存儲char或int值。所以決定使通用的實現:

public class Node<T> where T : struct, IConvertible 
{ 
    public Node<T> next = null; 
    public T data = default(T); 

    public Node(T value) { this.data = value; } 
} 

我已創建通過在範圍[33127)產生隨機值,該值轉換爲被T指定的類型的鏈接列表的方法(例如,如果86是生成並且T是Char,那麼要存儲在鏈表節點中的值將是'V';如果T是Int32,則值將簡單地爲86)。我現在面臨兩個問題:

static Node<IConvertible> CreateList<T>(int len) where T : struct, IConvertible 
    { 
     Random r = new Random((int)DateTime.Now.Ticks); 
     T value = (T)r.Next(33, 127);  // Problem #1 

     Node<T> head = new Node<T>(value); 
     Node<T> n = head; 

     for (int i = 1; i < len; i++) 
     { 
      n.next = new Node<T>(value); 
      n = n.next; 
     } 
     return head; // Problem #2 
    } 

這些都是存在的問題:

1)通常,這是可能的:(INT)值=(char)的r.Next(33,127)。爲什麼如果T是Char類型,那麼編譯器會說「即使我指定了」where T:struct,IConvertible「,也不能將類型'int'轉換爲'T'」?

2)「無法隱式轉換類型‘LinkedList.Node<T>’到‘LinkedList.Node<System.IConvertible>’」如果T爲的Int32或字符二者均實現IConvertible,什麼是投Node<Int32>Node<Char>Node<IConvertible>的方式嗎?

非常感謝!

回答

1

使用

T value = (T)Convert.ChangeType(r.Next(33, 127), typeof(T)); 
2

您使用的Random生成一些數據是有點在使用泛型的賠率。我將兩者分開,像這樣:

static Node<T> CreateList<T>(int len, Func<T> dataProvider) where T : struct, IConvertible 
{ 
    Node<T> head = new Node<T>(dataProvider()); 
    Node<T> n = head; 

    for (int i = 1; i < len; i++) 
    { 
     n.next = new Node<T>(dataProvider()); 
     n = n.next; 
    } 
    return head; 
} 

調用代碼:

Random r = new Random(); 
Node<char> list = CreateList(10,() => (char)r.Next(33, 127)); 

第二個問題是Node<IConvertible>不上Node<T>struct約束允許的。只需返回一個Node<T>。即使您從Node<T>中刪除struct約束,也不可能返回Node<IConvertible>,因爲泛型類不支持差異。

6

問題是T可能是任何結構,例如, Guid,SByte ...或定製新款。雖然我們可以肯定的是牛逼structIConvertible,也並不一定是明確的轉換操作符

public static explicit operator AnyStruct(int i) 

第二個問題鑄造Node<System.IConvertible>Node<System.IConvertible>是平常。任何列表List<T>不能轉換爲List<System.IConvertible>

我們需要的是接口上的協方差聲明:INode<out T>。然後INode<T>可以轉換成INode<System.IConvertible>

相關問題