2012-11-23 16 views
9

मैं जेनेरिक के लिए नया हूं और मुझे एक छोटे से आत्म अभ्यास कोड को लागू करने में कुछ परेशानी हो रही है।मैं एक सामान्य प्रकार पैरामीटर के लिए एक int मान कैसे लगा सकता हूं जो 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; } 
} 

मैं है एक विधि है कि सीमा [33,127) में यादृच्छिक मान पैदा करने, प्रकार टी द्वारा निर्दिष्ट करने के लिए मूल्य में कनवर्ट करके लिंक्ड सूची बनाता है (उदाहरण के लिए यदि 86 है: तो मैं कार्यान्वयन सामान्य बनाने का फैसला किया उत्पन्न और टी चार है, तो लिंक किए गए सूची नोड में संग्रहीत करने वाला मान 'वी' होगा; यदि टी 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) आम तौर पर यह संभव है: (पूर्णांक) मूल्य = (चार) r.Next (33, 127) मैं दो समस्याओं का सामना कर रहा हूँ। क्यों टी टी प्रकार का है, तो कंपाइलर कहता है, "टाइप 'int' to 't' को परिवर्तित नहीं किया जा सकता है, भले ही मैंने" जहां टी: स्ट्रक्चर, आईकोनवर्टिबल "निर्दिष्ट किया हो?

2) "परोक्ष प्रकार 'LinkedList.Node<System.IConvertible>' के लिए कनवर्ट नहीं कर सकता 'LinkedList.Node<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> से बाधा को हटाते हैं, तो Node<IConvertible> वापस करना संभव नहीं होगा क्योंकि सामान्य वर्ग भिन्नता का समर्थन नहीं करते हैं।

6

मुद्दा यह है कि टी कोई भी संरचना हो सकती है, उदा। Guid, SByte ... या कस्टम-नई-एक। और हम यह सुनिश्चित करें कि टीstruct और IConvertible है हो सकता है, जबकि, वहाँ

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>

में परिवर्तित किया जा सकता है
संबंधित मुद्दे

 संबंधित मुद्दे