Пакет не существует в текущем контексте

#c# #variables

#c# #переменные

Вопрос:

После того, как я задал свой первый вопрос и прочитал некоторые предоставленные ссылки, я решил просто перенести уровень связи из открытого исходного кода 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;
  

Любая помощь была бы отличной.

Комментарии:

1. Что Packet в строке с ошибкой? Кроме того, что говорит ошибка компилятора?

2. Соглашение заключается в использовании строчной буквы для начала имен переменных. Это облегчит чтение вашего кода другими программистами.

3. @unholysampler Спасибо за предложение. Все, что я знаю, в значительной степени самоучитель через учебные пособия на YouTube или в Интернете. Думаю, я подхватил несколько вредных привычек. Я начну использовать строчные буквы как можно чаще.

Ответ №1:

В целом, похоже, с этим кодом связано довольно много проблем, но если вы сможете опубликовать подробную информацию об ошибке, это может помочь нам помочь вам немного раньше. Давайте посмотрим, возможно, как вы преодолели это препятствие:

Packet это массив, поэтому, похоже, вы хотите получить доступ по индексу следующим образом:

 Packet[Enumerations.ClientPackets.CAddChar] = HandleAddChar;
  

Но массив является ссылочным типом, и поэтому его необходимо создать — это означает, что даже с учетом вышесказанного вы получите NullReferenceException . Кроме того, HandleAddChar является методом и требует аргументов в соответствии с параметрами как часть его определения; и то, что вы намереваетесь сделать, это не то, что вы бы выразили, даже передавая соответствующие значения. Итак:

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

Обратите внимание, что я удалил использование Enumerations.ClientPackets.CAddChar , поскольку это бессмысленно в данном контексте, идея заключается в том, что массив должен быть создан с соответствующей емкостью. Наконец, вы не хотите вызывать HandleAddChar здесь напрямую, нам нужна ссылка на делегат, поэтому это то, что мы создаем и вставляем в массив.

Комментарии:

1. Спасибо за помощь. Единственное, что мне интересно, пока я не смогу вернуться домой сегодня вечером, не должен ли первый пакет быть 0, а затем пакет для handleaddchar быть 1? Мне еще многому предстоит научиться в C #. Исходящий из vb6 и vb.net предположение на самом деле не помогает. Я, вероятно, должен просто изучить UPD, чем пытаться перевести что-то из vb.net . Я думаю, это был бы лучший маршрут.

2. @cryzone9584: число 1 в моем примере указывает на длину массива (сколько PacketDelegate в него может поместиться), а 0 указывает на индекс (определенную точку в массиве, в которую мы хотим что-то «поместить».) Это индексирование на основе нуля, смотрите здесь для различия между системами индексирования: en.wikipedia.org/wiki/Index_ (computer_science)

3. Еще раз спасибо за помощь. Я продолжу это, как только закончу свои последние 3 крупных проекта для колледжа. Я вернусь и еще раз спасибо,