Это было бы очень обидно. MS убрал 99% (законных) жалоб VB-фанатов с OPTION STRICT / EXPLICIT ON, думаю, они просто пропустили это.

етил кое-что очень неприятное с обработкой объектов Winform в VB.Net.

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

Вот приемлемый способ сделать вещи:

Dim FormInstance as New FormClassName
If FormInstance.ShowDialog() = DialogResult.OK then
    TheAnswer = FormInstance.TextBox1.Text
EndIf

Однако это позволяет:

If FormClassName.ShowDialog() = DialogResult.OK then
    TheAnswer = FormClassName.TextBox1.Text
EndIf

Имейте в виду, свойства и методы не являются общими. Превращение Application Framework не имеет значения. Кажется, что за кулисами VB создает глобальную копию формы и перенаправляет этот синтаксис в эту глобальную ссылку. Вы можете вообразить хаос, который это наносит современной программе! Часто разработчик добавит его, или мы пропустим очистку какого-то непонятного кода от преобразования (да, я ищу это сейчас, так что это помогает).

Любая настройка, которую я могу сделать, чтобы это выдало сообщение об ошибке, например,Reference to a non-shared, member requires an object referenceКак это должно быть?

Вот решение:

Я выбрал ответ jmoreno, потому что он указал на виновника для меня:My.Forms, Исправить это было так же просто, как поместить это в модуль:

Namespace My.MyProject.MyForms
End Namespace

Тогда вы получите точную ошибку, о которой я упоминал выше. Так же, как вы должны. Если вам это нужно для устаревших приложений (что хорошо), не делайте этого! Я подумал, что Gserg может быть просто бить VB (забавно, но не полезно), но он сразу все это упомянул, и, поскольку я нашел ответ, мы снова хорошо понимаем, что vb не сосет, если вы просто не знакомы с ним.

Обратите внимание, что если вы используете каркас приложения, вы получите ошибку, которую вы не хотите в application.designer. Исправление:

    Protected Overrides Sub OnCreateMainForm()
        ''//was: Me.MainForm = Global.WindowsApplication2.Form1
        Me.MainForm = New Form1
    End Sub

Надеюсь, это будет для любых плохих побочных эффектов!

Отражение Морено и др.

Вышесказанное настолько просто, что я не хотел бы предлагать что-то еще, но если вам интересно, вот улучшения этого кода, чтобы (1) добавить отражение, чтобы не было необходимости жестко кодировать в каждой создаваемой вами форме и (2) делать это автоматически принудительное выполнение (всего один вызов этого саба при запуске программы). Просто поместите это в модуль:

Public Sub FixMyForms()
    For Each pi As System.Reflection.PropertyInfo In GetType(My.MyProject.MyForms).GetProperties
        Dim obj As Object = pi.GetValue(My.Forms, Nothing)
        If TypeOf obj Is Form Then
            AddHandler CType(obj, Form).Load, AddressOf Complainer
        End If
    Next
End Sub

Private Sub Complainer(ByVal sender As Object, ByVal e As System.EventArgs)
    MsgBox("WRONG!")
End Sub

Ответы на вопрос(0)

Ваш ответ на вопрос