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>?
非常感谢!
问题是T可以是任何结构,例如Guid,SByte ......或custom-new-one.虽然我们可以确定T是struct和IConvertible,但是没有必要使用显式的强制运算符
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>
使用
T value = (T)Convert.ChangeType(r.Next(33, 127), typeof(T));
Run Code Online (Sandbox Code Playgroud)