Вы, вероятно, пытаетесь написать этот код в классе, который является потомком класса, который объявляет событие ChatEvent
.Это не может быть сделано, так как события могут рассматриваться только как переменные (включая их вызов) в классе, который их объявляет.Это связано с тем, что ключевое слово event
фактически указывает компилятору, что ему необходимо выполнить некоторые закулисные преобразования.
Что происходит
Рассмотрим это заявление:
Public Event MyEvent as EventHandler
Достаточно просто, верно?Однако на самом деле это так (вы просто этого не видите)
Private compilerGeneratedName as EventHandler
Public Event MyEvent as EventHandler
AddHandler(ByVal value as EventHandler)
compilerGeneratedName += value
End AddHandler
RemoveHandler(ByVal value as EventHandler)
compilerGeneratedName -= value
End RemoveHandler
RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
compilerGeneratedName.Invoke(sender, e)
End RaiseEvent
End Event
И когда вы вызываете событие:
RaiseEvent MyEvent(Me, EventArgs.Emtpy)
На самом деле он вызывает код вRaiseEvent
block.
Edit
Если события в VB.NET не могут быть обработаны как переменные в любом месте (их можно рассматривать какпеременные в объявленном классе в C #, поэтому ваш пример C # компилируется), тогда вам придется явно реализовать событие самостоятельно.См. Страницу MSDN в операторе Event для получения дополнительной информации о том, как это сделать.Короче говоря, вы захотите каким-то образом хранить несколько обработчиков событий (или использовать один обработчик событий вместе с GetInvocationList
, как вы пытаетесь это сделать сейчас).В ваших кодовых блоках AddHandler
и RemoveHandler
вы добавляете и удаляете из списка обработчиков событий (соответственно).
Вы можете использовать что-то вроде этого:
Private myEventList as New List(Of EventHandler)
Public Custom Event MyEvent as EventHandler
AddHandler(ByVal value as EventHandler)
myEventList.Add(value)
End AddHandler
RemoveHandler(ByVal value as EventHandler)
myEventList.Remove(value)
End RemoveHandler
RaiseEvent(ByVal sender as Object, ByVal e as EventArgs)
For Each evt in myEventList
evt.BeginInvoke(sender, e, New AsyncCallback(AddressOf EndAsync), Nothing)
Next
EndRaiseEvent
End Event
Так что теперь, если вы позвоните
RaiseEvent MyEvent(Me, EventArgs.Emtpy)
, это поднимет событие так, как вы ожидаете.