Я новичок в дженериках, и у меня возникли проблемы с реализацией небольшого кода для самостоятельной практики.
Я создаю связанный список. Я хочу, чтобы он хранил значения 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). Я сталкиваюсь с двумя проблемами:
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, компилятор говорит: «Невозможно преобразовать тип 'int' в 'T'», даже если я указал «где T: struct, IConvertible»?
2) «Невозможно неявно преобразовать тип 'LinkedList.Node<T>
' в 'LinkedList.Node<System.IConvertible>
'». Если T является либо Int32, либо Char, и оба они реализуют IConvertible, как преобразовать Node<Int32>
или Node<Char>
в Node<IConvertible>
?
Большое спасибо!