私はジェネリックが初めてで、小さな自己実践コードの実装に問題があります。
リンクリストを作成しています。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) の範囲でランダムな値を生成し、その値を T で指定された型に変換してリンク リストを作成するメソッドがあります (たとえば、86 が生成され、T が Char の場合、値はリンク リストに格納されます)。 node は '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) value = (char) r.Next(33, 127). T が Char 型の場合、「where T : struct, IConvertible」を指定したにもかかわらず、コンパイラは「型 'int' を 'T' に変換できません」と言うのはなぜですか?
LinkedList.Node<T>
2) 「型 ' ' を ' ' に暗黙的に変換できませんLinkedList.Node<System.IConvertible>
」 T が Int32 または Char のいずれかであり、それらの両方が IConvertible を実装している場合、キャストNode<Int32>
またはNode<Char>
への方法は何Node<IConvertible>
ですか?
どうもありがとう!