C#;无法通过引用将变量传递到通用链表中
我有一个项目,我需要修改提供的代码,用一个通用链表做各种事情。我的问题是无法将变量值作为列表中的节点。我不断地得到NullReferenceExceptions,而不管我似乎没有空值这一事实。我会发布一些代码和它告诉我的问题出现在什么行C#;无法通过引用将变量传递到通用链表中,c#,generics,nullreferenceexception,C#,Generics,Nullreferenceexception,我有一个项目,我需要修改提供的代码,用一个通用链表做各种事情。我的问题是无法将变量值作为列表中的节点。我不断地得到NullReferenceExceptions,而不管我似乎没有空值这一事实。我会发布一些代码和它告诉我的问题出现在什么行 public static void Main(string[] args) { UnorderedLinkedList<int> u = new UnorderedLinkedList<int>();
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;”无法为您提供空引用异常,因为此行中没有任何内容试图取消引用指针。请检查异常是什么,并让我们知道。在阅读此处的评论后,我进行了一些编辑,现在我得到了一个包含整数、双精度和字符串的列表。谢谢