2012-11-23 11 views
9

Ben jenerikler için yeni ve küçük bir kendi kendine çalışma kodu uygulamakta sorun yaşıyorum.Bir int değerini, char gibi eşdeğer bir jenerik tür parametresine nasıl atarım?

Bağlı bir liste oluşturuyorum. Char veya int değerlerini depolamasını istiyorum. I (86 T ile belirtilen tip değer dönüştürülmesi, aralık [33.127) rastgele değerlerinin üretilmesi ile bağlantılı liste oluşturan bir yöntem, örneğin eğer

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; } 
} 

: Bu yüzden genel bir uygulama yapmaya karar oluşturulan ve T Char, sonra bağlı liste düğümünde depolanacak değer 'V' olacak, T Int32 ise, o zaman değer sadece 86 olacaktır.

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 
    } 

Bu problemler şunlardır:

1) Normal olarak bu mümkündür: (int) değeri = (char) r.Next (33, 127) iki sorunlarla karşı karşıya ediyorum. Neden T türü Char ise, derleyici "Nerede T: struct, IConvertible" belirtmiş olsam bile "int 'int', 'T' türünü dönüştüremiyor" diyor.

2) T Int32 veya Char ve bunların her ikisi IConvertible uygulamak ise "örtük 'LinkedList.Node<System.IConvertible>' için 'LinkedList.Node<T>' türü dönüştürülemez", Node<IConvertible> için Node<Int32> veya Node<Char> döküm yolu nedir?

Çok teşekkürler!

cevap

1

Kullanım

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

bazı verilerini oluşturmak için Random kullanımınız eşdeğer ilaç kullanımıyla ile ters çeşit olduğunu.

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; 
} 

çağıran kodu:

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

ikinci konu Node<IConvertible> olduğunu Node<T> üzerinde struct kısıtlaması tarafından izin verilmeyen iki şöyle ayırmak olacaktır. Sadece Node<T>'u döndür. Node<T>'dan struct kısıtlamasını kaldırsanız bile, genel sınıflar varyansı desteklemediğinden bir Node<IConvertible> döndürmek mümkün olmaz.

6

Sorun, T'un herhangi bir yapı, örn. Guid, SByte ... veya özel yeni bir. Tstruct ve IConvertible olduğundan emin olabiliriz ederken ve

public static explicit operator AnyStruct(int i) 

Node<System.IConvertible> için Node<System.IConvertible> olağandır döküm ikinci konu için açık döküm operatörü olmak zorunda değildir. Herhangi bir List<T> listesi List<System.IConvertible>'a dönüştürülemez.

İhtiyacımız olan arabirimde kovaryans bildirimi: INode<out T>. Sonra INode<T>, INode<System.IConvertible>

'a dönüştürülebilir
İlgili konular