当前位置:编程学习 > C#/ASP.NET >>

有关泛型类间的类型转换问题

我写了两个泛型类,一个是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);
--------------------编程问答--------------------
引用 1 楼 lunasea0_0 的回复:
你的GetNodeByIndex的返回应该也是T吧。
改成:T = prev = GetNodeByIndex(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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,