2016-01-05 8 views
-1

Я нашел код онлайн, который был C#. Я использовал конвертер кода telerik для преобразования в VB.net. Я получаю сообщение об ошибке для приведенного ниже кода.Ошибка обработчика событий

Закрыто уже объявлено как «публичный Even Closed (Sender as object, e as System.EventArgs)» в этом классе.

Произошла одна и та же ошибка. У кого-нибудь есть идеи исправить?

#Region "Events" 
    Public Event Closed As EventHandler 
    Public Event Shown As EventHandler 

    Protected Overridable Sub closed(e As EventArgs) 
     Dim handler As EventHandler = Closed 

     RaiseEvent handler(Me, e) 
    End Sub 

    Protected Overridable Sub shown(e As EventArgs) 
     Dim handler As EventHandler = Shown 

     RaiseEvent handler(Me, e) 
    End Sub 
#End Region 

Здесь приведен код C#, преобразованный в VB.

#region Events 
    public event EventHandler Closed; 
    public event EventHandler Shown; 

    protected virtual void closed(EventArgs e) 
    { 
     EventHandler handler = Closed; 

     if (handler != null) handler(this, e); 
    } 

    protected virtual void shown(EventArgs e) 
    { 
     EventHandler handler = Shown; 

     if (handler != null) handler(this, e); 
    } 
    #endregion 
+0

Отправьте исходный код на C#. – Aybe

+0

Как и ошибка (компилятор?), Которую вы получаете, или стекtrace ... В настоящее время это догадка, в чем проблема ... –

+0

@ScottChamberlain Он уже сделал «Я получаю сообщение об ошибке для кода ниже, Closed уже объявлен как 'public Even Closed (Sender as object, e as System.EventArgs)' в этом классе. " – Marshal

ответ

1

Здесь есть 2 проблемы.

Во-первых, если вы используете WinForms, у System.Windows.Forms уже есть Closed событие, которое конфликтует с событием, которое вы создаете. Поэтому, если предполагается затенение, вы должны затенять событие, объявив Shadows. Но если вы объявляете это в нормальном классе (который не получается из Form), вам не нужно об этом беспокоиться.

Public Shadows Event Closed As EventHandler 
Public Shadows Event Shown As EventHandler 

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

Public Event Closed As EventHandler 
Public Event Shown As EventHandler 

Protected Overridable Sub whenClosed(ByVal e As EventArgs) 
    RaiseEvent Closed(Me, e) 
End Sub 

Protected Overridable Sub whenShown(ByVal e As EventArgs) 
    RaiseEvent Shown(Me, e) 
End Sub 
+0

Нет, в этом случае C#/VB.NET попросит создать «новое событие ...», вы можете (я знаю, что это ужасное дизайнерское решение) имеют несколько элементов в пути наследования, то же имя. –

+1

Да, но если затенение намерено, оно должно быть затененным. [Вот что говорит MSDN] (https://msdn.microsoft.com/en-us/library/ya2h8das.aspx). И если затенение не предназначено, он должен изменить имена событий, такие как 'WhenClosed' или' WhenShown' – Marshal

2

Она смотрит на меня это является следствием того факта, что VB.NET is case insensitive означает, что элемент shown эквивалентен элементу Shown.

Вы можете решить эту проблему, переименовав (лучше используя какой-либо инструмент рефакторинга) одно из событий, так что столкновение имен не появляется. Вам лучше сделайте это на уровне проекта C#, а затем запустите инструмент transcompiler еще раз, чтобы создать эквивалентный код VB.NET.

+0

Я пробовал сделать его чувствительным к регистру без везения – Steve

+0

@Steve: что вы имеете в виду * попытался *, ваш код стал чувствительным к регистру? Обновите свой вопрос новыми сведениями ... –

Смежные вопросы