在询问了我的第一个问题并阅读了一些提供的链接后,我决定将通信层从我用过几个月的开源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;
任何帮助都会很棒。
答案 0 :(得分:3)
总的来说,这个代码看起来有很多问题,但如果您可以发布错误详情,那么它可能会帮助我们更快地帮助您。让我们看看可能会让你通过这个障碍:
Packet
是一个数组,所以看起来你想按索引访问:
Packet[Enumerations.ClientPackets.CAddChar] = HandleAddChar;
但是数组是引用类型,因此需要实例化 - 这意味着即使使用上述内容,您也会获得NullReferenceException
。此外,HandleAddChar
是一种方法,并且根据参数作为其定义的一部分需要参数;如果传递适当的值,那么你打算做的不是你所表达的。所以:
public PacketHandler()
{
Packet = new PacketDelegate[1];
Packet[0] = new PacketDelegate(HandleAddChar);
}
请注意,我删除了Enumerations.ClientPackets.CAddChar
的使用,因为它在此上下文中毫无意义,其想法是必须数组实例化并具有适当的容量。最后,你不想直接在这里调用HandleAddChar
,我们需要一个委托引用,这就是我们创建并插入到数组中的内容。