有关泛型类间的类型转换问题
我写了两个泛型类,一个是LinkList<T>,一个是Node<T>。后来,我在LinkList类中有这么一个函数,目的是按照索引删除指定位置的节点。这是《数据结构》里关于单链表的一个例子。
public T DeleteNode(int index) //按照索引 index 删除指定位置的元素
{
if (index < 0 || index > Size - 1)
{
throw new IndexOutOfRangeException("搜索索引越界!");
}
Node<T> Del = null; //定义“删除”节点
if (index == 0)
{
//算法是:把头节点元素赋给删除节点,标明要删除它
//然后,让原来头节点的引用赋给头节点。
Del = Header;
Header = Header.Next;
}
else
{
//获取要被删除的节点的前一个节点
Node<T> prev = GetNodeByIndex(index - 1);
//获取将要被删除的节点
Del = prev.Next;
//将原来要删除的节点的引用赋给prev.Next,
//这样一来,prev.Next就指向要删除节点的下一个节点
prev.Next = Del.Next;
//将被删除节点的引用设为空,就是将它从线性表中删除了。
Del.Next = null;
}
Size--;
return Del.Data;
}
但这里报错:无法将类型“T”隐式转换为“LinkList.Node<T>”。错误在上面代码的红色部分。
我个人觉得为题可能在于:定义的两个泛型类的类型参数T,虽然都是字母T,但“同名不同人”,不是同一类类型,因此无法隐式转换。不知各位有解决办法吗?先谢谢各位啦。
另:有哪位高手有关于《数据结构》的教程,推荐一下。 --------------------编程问答-------------------- 你的GetNodeByIndex的返回应该也是T吧。
改成:T = prev = GetNodeByIndex(index - 1);试试看 --------------------编程问答-------------------- 最好把你的GetNodeByIndex方法拿出来看看,返回究竟是T还是Node<T>? --------------------编程问答--------------------
你的GetNodeByIndex(index - 1);--------------------编程问答--------------------
方法必须是这样申明的
public Node<T> GetNodeByIndex(int);
如果你的T没有在类中申明,那么你就必须这样定义
public Node<T> GetNodeByIndex<T>(int);
调用的时候,就应该这样
Node<T> prev = GetNodeByIndex<T>(index - 1);
T是类型参数,这里当变量使用,不可能吧!!!! --------------------编程问答-------------------- --------------------编程问答-------------------- 下面这段代码是定义的GetNodeByIndex函数。不知道哪里出了问题?
public T GetNodeByIndex(int index) //根据索引 index 获取指定位置的元素
{
if (index < 0 || index > Size-1)
{
throw new IndexOutOfRangeException("搜索索引越界!");
}
//设current为当前节点,以它来回线性表中每一项元素作比较
Node<T> current = Header; //从头节点开始搜索
for (int i = 0; i < Size && current != null; current = current.Next)
{
if (i == index)
{
return current.Data;
}
}
//若查找不到,则返回空null
return default(T);
}
--------------------编程问答-------------------- 下次代码贴完整。否则不知道你错误是什么。
以下代码是可以通过编译的。
public class Node<T>
{
public T Data { get; set; }
public Node<T> Next = null;
}
public class Tree<T>
{
public Node<T> Header = null;
public int Size { get; set; }
public List<Node<T>> nodes = new List<Node<T>>();
public T DeleteNode(int index) //按照索引 index 删除指定位置的元素
{
if (index < 0 || index > Size - 1)
{
throw new IndexOutOfRangeException("搜索索引越界!");
}
Node<T> Del = null; //定义“删除”节点
if (index == 0)
{
//算法是:把头节点元素赋给删除节点,标明要删除它
//然后,让原来头节点的引用赋给头节点。
Del = Header;
Header = Header.Next;
}
else
{
//获取要被删除的节点的前一个节点
Node<T> prev = GetNodeByIndex(index - 1);
//获取将要被删除的节点
Del = prev.Next;
//将原来要删除的节点的引用赋给prev.Next,
//这样一来,prev.Next就指向要删除节点的下一个节点
prev.Next = Del.Next;
//将被删除节点的引用设为空,就是将它从线性表中删除了。
Del.Next = null;
}
Size--;
return Del.Data;
}
public Node<T> GetNodeByIndex(int index)
{
return nodes[index];
}
}
补充:.NET技术 , C#