提问人:Leo Barber 提问时间:7/17/2022 最后编辑:Leo Barber 更新时间:7/17/2022 访问量:250
First.LinkedList 的值为 null,但链表不为空
First.Value of LinkedList is null but linked list is not empty
问:
我正在编写主机游戏,但在尝试使用 LinkedList.First.Value 时出现错误,因为它返回 null。但是,列表不是空的,正如我设置的那样,第一个条目是 55。
LinkedList<int> Pos = new LinkedList<int>();
主要:
var p = new Program();
p.Pos.AddFirst(55);
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(Move);
myTimer.Interval = 1000;
myTimer.Start();
导致代码(移动)的错误:
p.Pos.AddFirst(p.Pos.First.Value + p.dir);
System.NullReferenceException: '对象引用未设置为 对象的实例。
System.Collections.Generic.LinkedList.First.get 返回 null。
完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Collections;
namespace Snake
{
class Program
{
LinkedList<int> Pos = new LinkedList<int>();
int dir = 1;
bool snakeAlive = true;
static void Main(string[] args)
{
var p = new Program();
p.Pos.AddLast(55);
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler(Move);
myTimer.Interval = 1000; // 1000 ms is one second
myTimer.Start();
do
{
switch (Console.ReadKey().Key)
{
case ConsoleKey.UpArrow:
p.dir = -10;
break;
case ConsoleKey.DownArrow:
p.dir = 10;
break;
case ConsoleKey.LeftArrow:
p.dir = -1;
break;
case ConsoleKey.RightArrow:
p.dir = 1;
break;
}
} while (p.snakeAlive == true);
}
void drawGame()
{
Console.Clear();
for (int i = 0; i < 100; i++)
{
if (i % 10 == 9)
{
Console.WriteLine(IsSnake(Pos, i));
}
else
{
Console.Write(IsSnake(Pos, i));
}
}
}
String IsSnake(LinkedList<int> sPos, int position)
{
for (int i = 0; i < sPos.Count; i++)
{
if (position == sPos.ElementAt(i))
{
return "==";
}
}
return "[]";
}
public static void Move(object source, ElapsedEventArgs e) {
var p = new Program();
p.Pos.AddFirst(p.Pos.First.Value + p.dir);
p.Pos.RemoveLast();
p.drawGame();
}
}
}
答:
0赞
Klaus Gütter
7/17/2022
#1
var p = new Program();
在 Move 事件处理程序中,将创建 Program 类的新实例,该实例与之前创建的实例无关。其列表将为空。Pos
您可以将该方法设为实例方法(删除 ),并将事件订阅更改为Move
static
myTimer.Elapsed += new ElapsedEventHandler(p.Move);
在 Move 方法中,您可以直接使用 .Pos
评论
0赞
Leo Barber
7/17/2022
这有效,谢谢,我还没有真正把整个静态和实例的事情缠绕起来
评论
new Program()