.LinkedList的值为null,但链表不为空



我正在编程一个控制台游戏,但我得到一个错误,试图使用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();

错误导致代码(Move):

p.Pos.AddFirst(p.Pos.First.Value + p.dir);

系统。NullReferenceException: '对象引用未设置为an对象的实例。'

System.Collections.Generic.LinkedList.First。返回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();
}
}
}

Move事件处理程序中的var p = new Program();将创建一个与您之前创建的实例无关的Program类的新实例。它的Pos列表将为空。

您可以使Move方法成为实例方法(删除static)并将事件订阅更改为myTimer.Elapsed += new ElapsedEventHandler(p.Move);

在Move方法中,您可以直接使用Pos

最新更新