数据包在当前上下文中不存在

本文关键字:不存在 上下文 数据包 | 更新日期: 2023-09-27 17:50:25

在问了我的第一个问题并阅读了提供的一些链接之后,我决定将我使用了几个月的开源vb.net项目的通信层移植到c#上。我开局不错。现在我确实有问题了。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
namespace Eclipse_5._0
{
    class PacketHandler
    {
        #region Packet Constructors
        private delegate void PacketDelegate(int Index, byte[] Data);
        private PacketDelegate[] Packet;
        public PacketHandler()
        {
            Packet(Enumerations.ClientPackets.CAddChar) = HandleAddChar;
        }
        #endregion
        #region Packet Methods
        public void Handledata(int Index, byte[] Data, int MsgType)
        {
            ByteBuffer Buff = new ByteBuffer();
            Buff.WriteBytes(Data);
            if (MsgType < 0)
            {
                return;
            }
            if (MsgType >= (int)Enumerations.ClientPackets.CQuit)
            {
                return;
            }
            Packet(MsgType).Invoke(Index, Buff.ReadBytes(Buff.Length()));
            Buff.Dispose();
        }
        public void HandleNewAccount(int Index, byte[] Data)
        {
            //TODO: Add New Player Account File.
        }
        public void HandleAddChar(int Index, byte[] Data)
        {
            //TODO: Add New Character to Player Account File.
        }
        #endregion
    }
}

下面一行有错误

Packet(Enumerations.ClientPackets.CAddChar) = HandleAddChar;

数据包在当前上下文中不存在

总的来说,看起来这段代码有很多问题,但是如果你能发布错误细节,那么它可能会帮助我们更快地帮助你。让我们看看如何通过这个障碍:

Packet是一个数组,所以看起来你想通过这样的索引来访问它:

Packet[Enumerations.ClientPackets.CAddChar] = HandleAddChar;

但是数组是一种引用类型,因此需要实例化——这意味着即使在上面的地方,你也会得到一个NullReferenceException。此外,HandleAddChar是一个方法,需要根据参数作为其定义的一部分进行参数;你想要做的并不是你想要表达的即使传递了合适的值。所以:

public PacketHandler()
{
    Packet = new PacketDelegate[1];        
    Packet[0] = new PacketDelegate(HandleAddChar);
}

请注意,我已经删除了Enumerations.ClientPackets.CAddChar的使用,因为它在此上下文中没有意义,其思想是数组必须被实例化并具有适当的容量。最后,您不想在这里直接调用HandleAddChar,我们需要一个委托引用,所以这就是我们创建并插入到数组中的内容。