у меня ошибка при создании события

#c# #.net #winforms #events #event-handling

#c# #.net #winforms #Мероприятия #обработка событий

Вопрос:

у меня есть следующее:

игровой класс

 class Game
{
    public event EventHandler GameOver;

    public void go()
    {
        PlayerAliveEventArgs playerAlive = new PlayerAliveEventArgs(Alive);
        GameOver(this, playerAlive);
    }
}
  

тогда у меня есть класс

 public  class PlayerAliveEventArgs : EventArgs
{
    public bool Alive { get; set; }

    public PlayerAliveEventArgs(bool deadOrAlive)
    {
        Alive = deadOrAlive;
    }
}
  

в другом классе я привязываю метод к событию…

 public void Form_Load()
{
     game.GameOver  = Form1_GameOverMethod; // it shows the error here.
     it says no overload of this method matches System.Eventhandler
}

public void Form1_GameOverMethod(object sender, PlayerAliveEventArgs e)
{
    if (!e.Alive)
    {
        GameTimer.Enabled = false;
        gameOver = true;
        Refresh();
    }
}
  

Ошибка заключается в:

Метод не существует в этом контексте.

Почему это?

хорошо, я внес следующие изменения:

  public void Form1_GameOverMethod(object sender, EventArgs e)
 {
      PlayerAliveEventArgs d = (PlayerAliveEventArgs)e;
      if (!d.Alive)
      {
      }
 }
  

теперь все в порядке? или при его запуске возникнут какие-то проблемы (я хочу сэкономить на отладке последнего ..)

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

1. Оператор ( =) здесь добавляет метод обработчика событий к вашему объекту event.

Ответ №1:

Объявление события:

 public event EventHandler<PlayerAliveEventArgs> GameOver;
  

Подписка:

 game.GameOver  = Form1_GameOverMethod;
  

Обработчик событий:

 private void Form1_GameOverMethod(object sender, PlayerAliveEventArgs e)
{
    bool alive = e.Alive;
}
  

Запуск:

 if (this.GameOver != null) // does any subscriber exist?
{
    this.GameOver(this, new new PlayerAliveEventArgs(..));
}
  

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

1. но когда я добавляю его. это говорит мне об отсутствии перегрузки для метода matches System. Обработчик событий.. почему это?

2. Вы должны изменить делегат вашего события, чтобы он соответствовал Form1_GameOverMethod .. Я полагаю, вам нужно прочитать о создании событий…

3. хорошо .. сейчас я это исправил. я использовал приведение, потому что я все еще хочу использовать PlayerAliveEventArgs.. я привел это в коде из EventArgs..

4. @Dmitry: Вам нужно изменить подпись event . не из event handler !

5. @Akram: Вы можете использовать @ , чтобы указать, кому вы сообщаете 🙂

Ответ №2:

Вы должны использовать

 game.GameOver  = Form1_GameOverMethod;
  

Ответ №3:

Потому что ваш метод назван Form1_GameOverMethod .

Ответ №4:

GameOverMethod действительно не существует в этом контексте. однако то, что существует (и это то, что вы предполагали, я полагаю), Form1_GameOverMethod .

Еще пара замечаний. Во-первых, перед запуском события вы должны проверить, подписался ли кто-нибудь на него или нет.

 if(GameOver!=null)
    GameOver(this, new PlayerAliveEventArgs(Alive));
  

Во-вторых, я считаю, что вам следует изменить объявление события на:

 public event EventHandler<PlayerAliveEventArgs> GameOver;
  

Надеюсь, это поможет

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

1. потрясающе, я этого не знал .. но мне не нужно учитывать ваше первое событие, потому что подписка происходит, как только форма загружается сама. игра. GameOver =Form1_GameOverMethod находится внутри обработчика событий Form1_Load

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