2012-11-23 3 views
9

私はジェネリックスに新しく、小さな自己練習用コードを実装する際に問題があります。int型の値を、charなどの同等のジェネリック型のパラメータにキャストするにはどうすればよいですか?

リンクリストを作成しています。私はcharまたはint値を格納する必要があります。私は(86がTで指定された型に値を変換し、範囲[33127)でランダムな値を生成することにより、リンクリストを作成する方法であり、例えばしている場合

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

:だから私は、一般的な実装を作ることにしましたTがCharの場合、リンクされたリストノードに格納される値は 'V'になります; TがInt32の場合、値は単に86になります)。私は2つの問題に直面している:

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' 'に変換できないと言っていますか? TはどちらかであるのInt32またはchar、それらの両方がIConvertibleを実装する場合

2)は、「暗黙のうちに 『LinkedList.Node<System.IConvertible>』にタイプ 『LinkedList.Node<T>』を変換できません」、Node<IConvertible>Node<Int32>またはNode<Char>をキャストする方法は何ですか?

ありがとうございます!

答えて

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制約によって許可されていない私は2そうのように分離します。ちょうどNode<T>を返してください。 の制約をNode<T>から削除しても、汎用クラスは分散をサポートしていないため、Node<IConvertible>を返すことはできません。

6

Tは、任意の構造体にすることができます。 Guid、SByte ...またはカスタム新規ユーザーTstructIConvertibleであることを我々は確認することができながら、

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>

関連する問題