如何将int值转换为等效的泛型类型参数,如char?

use*_*118 9 c# generics casting linked-list type-conversion

我是仿制药的新手,我在实施一个小的自我实践代码时遇到了一些麻烦.

我正在创建一个链表.我希望它存储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; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个通过生成范围[33,127]中的随机值来创建链表的方法,将值转换为由T指定的类型(例如,如果生成86并且T是Char,那么要存储在链表中的值节点将为'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
    }
Run Code Online (Sandbox Code Playgroud)

这些是问题:

1)通常这是可能的:(int)value =(char)r.Next(33,127).为什么如果T是Char类型,编译器会说"无法将类型'int'转换为'T'",即使我已指定"where T:struct,IConvertible"?

2)"无法隐式转换类型' LinkedList.Node<T>’到' LinkedList.Node<System.IConvertible>""如果T为的Int32或字符二者均实现IConvertible,什么是投的方式Node<Int32>Node<Char>Node<IConvertible>

非常感谢!

Rad*_*ler 6

问题是T可以是任何结构,例如Guid,SByte ......或custom-new-one.虽然我们可以确定TstructIConvertible,但是没有必要使用显式的强制运算符

public static explicit operator AnyStruct(int i)
Run Code Online (Sandbox Code Playgroud)

第二个问题浇铸Node<System.IConvertible>Node<System.IConvertible>是常见.任何列表List<T>都无法转换为List<System.IConvertible>.

我们需要的是界面上的协方差声明:INode<out T>.然后INode<T>可以转换成INode<System.IConvertible>


Kir*_*nov 2

使用

T value = (T)Convert.ChangeType(r.Next(33, 127), typeof(T));
Run Code Online (Sandbox Code Playgroud)