C#;无法通过引用将变量传递到通用链表中

C#;无法通过引用将变量传递到通用链表中,c#,generics,nullreferenceexception,C#,Generics,Nullreferenceexception,我有一个项目,我需要修改提供的代码,用一个通用链表做各种事情。我的问题是无法将变量值作为列表中的节点。我不断地得到NullReferenceExceptions,而不管我似乎没有空值这一事实。我会发布一些代码和它告诉我的问题出现在什么行 public static void Main(string[] args) { UnorderedLinkedList<int> u = new UnorderedLinkedList<int>();

我有一个项目,我需要修改提供的代码,用一个通用链表做各种事情。我的问题是无法将变量值作为列表中的节点。我不断地得到NullReferenceExceptions,而不管我似乎没有空值这一事实。我会发布一些代码和它告诉我的问题出现在什么行

    public static void Main(string[] args)
    {  
        UnorderedLinkedList<int> u = new UnorderedLinkedList<int>();

        Console.WriteLine("int");
        int var = 5;
        u.insert(ref var);
        var = 12;
        u.print();
        u.insert(ref var);
        var = 2;
        u.print();
        u.insert(ref var);
        var = 29;
        u.print();
        u.insert(ref var);
        var = 5;
        u.print();
        u.insert(ref var);
        u.print();
        var = 5;

    }

namespace LinkedListNamespace
{
public abstract class LinkedList<T>
{
    protected class Node
    { 
        public T value;
        public Node next;

    }

    protected Node start = new Node();


 public LinkedList()
    {
        start = null;  //getting an exception from this line.
    }

}
 public class UnorderedLinkedList<T> : LinkedList<T>, LinkedListADT<T>
{
 public override void insert(ref T item)
    {
        if (start == null)
        {

            start.value = item; //getting an exception from this line as well.
        }
        else
        {
            Node temp;
            for (temp = start; temp.next != null; temp = temp.next)
            {
                temp.next.value = item;
            }
        }
    }  
}      
publicstaticvoidmain(字符串[]args)
{  
UnorderedLinkedList u=新建UnorderedLinkedList();
控制台写入线(“int”);
int-var=5;
u、 插入(参考变量);
var=12;
u、 打印();
u、 插入(参考变量);
var=2;
u、 打印();
u、 插入(参考变量);
var=29;
u、 打印();
u、 插入(参考变量);
var=5;
u、 打印();
u、 插入(参考变量);
u、 打印();
var=5;
}
命名空间LinkedListNamespace
{
公共抽象类链接列表
{
受保护类节点
{ 
公共价值观;
公共节点下一步;
}
受保护的节点开始=新节点();
公共链接列表()
{
start=null;//从此行获取异常。
}
}
公共类UnorderedLinkedList:LinkedList,LinkedList
{
公共覆盖无效插入(参考T项)
{
if(start==null)
{
start.value=item;//也从此行获取异常。
}
其他的
{
节点温度;
对于(临时=开始;临时下一步!=null;临时=临时下一步)
{
temp.next.value=项目;
}
}
}  
}      

如果有帮助的话,我可以从项目中提供更多的代码。

我谦虚地建议您不理解ref在做什么。它肯定会给出一个误导性的API。您有5行代码说

u、 插入(参考变量)

这种使用“ref”的API设计会让调用方相信这些都是在列表中插入相同的引用,即对变量var的引用。在这两者之间更改var的值是不相关的

中的空引用异常

start.value=项目

应该是明显的,因为只有当“start”为null时,该行才会执行。以防万一,它不明显:如果“start”为null,则不能对其设置属性或调用方法(这就是null引用异常)

编辑以添加: 另外,你必须给我们更多的线索,而不仅仅是说

start=null;//从此行获取异常


异常情况是什么?

if(start==null)start.value=item;
所以…如果
start
为空,您会尝试设置
start.value
,那么start为空,因此您会得到一个空引用异常,因为您无法设置
null
对象的
.value
值。空异常不是代码中唯一的问题。您为什么使用
ref
?您明白这是什么吗意思?请阅读更多关于.ref在我应该使用的提供的代码中使用的内容。以及继承和抽象类。@S.Dodson:我会严肃地质疑提供的材料的来源……特别是如果他们使用的名称
insert
,不符合.NET命名约定。如果这是你要学习的材料首先,我怀疑它的价值——你不想养成坏习惯。(公共领域也是个坏主意……)是的,你不是唯一一个质疑所提供材料来源的人。在同一个项目上工作的其他人也是。只是希望我在这方面的工作不会让我以后陷入困境。这些都是在列表中插入相同的引用。这段代码不会在列表中插入引用。尽管
insert
通过referee接受其论点nce,然后按值分配字段
value
。很抱歉,异常为空引用exception@PetSerAl谢谢,我已经编辑了,以澄清我对使用“ref”的API设计的担忧。@S.Dodson“start=null;”无法为您提供空引用异常,因为此行中没有任何内容试图取消引用指针。请检查异常是什么,并让我们知道。在阅读此处的评论后,我进行了一些编辑,现在我得到了一个包含整数、双精度和字符串的列表。谢谢