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

First.Value of LinkedList is null but linked list is not empty

提问人:Leo Barber 提问时间:7/17/2022 最后编辑:Leo Barber 更新时间:7/17/2022 访问量:250

问:

我正在编写主机游戏,但在尝试使用 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();
        }
    }
}
C# 链接列表 null nullreferenceexception

评论

0赞 Klaus Gütter 7/17/2022
您能否展示失败行的更多上下文?在哪里叫?这里的p是什么?
0赞 Leo Barber 7/17/2022
所有它是 var p = new Program();这是因为 main 和 elapsed 事件处理程序需要是静态的
0赞 Leo Barber 7/17/2022
也从 myTimer.Elapsed += new ElapsedEventHandler(Move) 调用;
0赞 Klaus Gütter 7/17/2022
编辑您的问题以显示它。如果在事件处理程序中创建,则其 Pos 列表将为空。new Program()
0赞 Leo Barber 7/17/2022
好的,它现在编辑了

答:

0赞 Klaus Gütter 7/17/2022 #1

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

您可以将该方法设为实例方法(删除 ),并将事件订阅更改为MovestaticmyTimer.Elapsed += new ElapsedEventHandler(p.Move);

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

评论

0赞 Leo Barber 7/17/2022
这有效,谢谢,我还没有真正把整个静态和实例的事情缠绕起来