Porque este olor similar a VB6, que VB.NET permite, en su lugar produce un error: WinFormType.InstanceProp = Value [DISABLE My.Forms]

He notado algo muy desagradable con el tratamiento de VB.Net de los objetos Winform.

Esto ha destrozado varias horas de nuestro tiempo. Solo empeorará a medida que tengamos más de nuestros programadores VB6 que están acostumbrados a hacer cosas como esta, y un código autoconvertido que lleva la construcción directamente desde vb6.

Aquí hay una forma aceptable de hacer las cosas:

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

Sin embargo, permite esto:

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

Tenga en cuenta que las propiedades y los métodos no son compartidos. El giro de Application Framework no importa. Parece que detrás de escena, VB crea una instancia de una copia global del formulario y redirige esta sintaxis a esa referencia global. ¡Puedes imaginar el caos que esto causa en un programa moderno! A menudo, un desarrollador lo lanzará o echaremos de menos limpiar algún código oscuro de la conversión (sí, estoy buscando esto ahora, así que eso ayuda).

Cualquier configuración que pueda hacer para que esto arroje un mensaje de error, por ejemplo,Reference to a non-shared, member requires an object reference, como debería?

Aquí está la solución:

Elegí seleccionar la respuesta de jmoreno porque señaló el culpable para mí:My.Forms. Arreglarlo fue tan fácil como poner esto en un módulo:

Namespace My.MyProject.MyForms
End Namespace

Entonces obtienes el error exacto que mencioné anteriormente. Justo como deberías. Si necesita eso para aplicaciones heredadas (algo bueno), ¡entonces no haga esto! Pensé que Gserg podría ser un golpe de VB (divertido pero no útil), pero mencionó todo esto de inmediato, y desde que encontré la respuesta, estamos bien de nuevo acerca de que vb no succione a menos que no esté familiarizado con él.

Nota: si utiliza el marco de la aplicación, obtendrá un error que no desea en application.designer. La solución

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

Espero que sea por cualquier efecto secundario negativo!

Reflexión de JMoreno, etc.

Lo anterior es tan simple que odiaría sugerir algo más, pero si tiene curiosidad, aquí hay mejoras en ese código para (1) agregar reflejo para omitir tener que codificar en cada forma que realice y (2) hacerlo aplicación automática (con solo una llamada a este sub al inicio del programa). Simplemente ponga esto en un módulo:

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta