Это было бы очень обидно. 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