Porque esse cheiro semelhante ao VB6, que o VB.NET permite, ao invés disso, erro: WinFormType.InstanceProp = Value [DISABLE My.Forms]

Tenho notado algo muito desagradável com o tratamento do VB.Net sobre objetos Winfor

Isso destruiu várias horas do nosso tempo. Isso só vai piorar, pois temos mais de nossos programadores VB6 acostumados a fazer coisas como essa e código autoconvertido que traz a construção diretamente da vb

qui está uma maneira aceitável de fazer as coisa

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

No entanto, permite:

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

Lembre-se de que as propriedades e métodos não são compartilhados. A mudança do Application Framework não importa. Parece que nos bastidores, o VB instancia uma cópia global do formulário e redireciona essa sintaxe para essa referência global. Você pode imaginar o estrago que isso causa em um programa moderno! Muitas vezes, um desenvolvedor o lança ou perderemos a limpeza de algum código obscuro da conversão (sim, estou procurando isso agora, o que ajuda).

Qualquer configuração que eu possa fazer para gerar uma mensagem de erro, por exemplo,Reference to a non-shared, member requires an object reference, como deveria?

Aqui está a solução:

Escolhi selecionar a resposta de jmoreno porque ele apontou o culpado por mim:My.Forms. A correção foi tão fácil quanto colocar isso em um módulo:

Namespace My.MyProject.MyForms
End Namespace

Então você recebe o erro exato que eu mencionei acima. Assim como você deveria. Se você precisar disso para aplicativos herdados (uma coisa boa), não faça isso! Eu pensei que Gserg poderia ser apenas um VB bashing (divertido, mas não útil), mas ele mencionou tudo isso imediatamente, e desde que eu encontrei a resposta, somos bons novamente em vb não sugar, a menos que você não esteja familiarizado com iss

Observe que, se você usar a estrutura do aplicativo, receberá um erro que não deseja no application.designer. O conserto

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

Felizmente isso seria por quaisquer efeitos colaterais ruins!

Reflexão de JMoreno, etc.

O acima é tão simples que eu odiaria sugerir qualquer outra coisa, mas se você estiver curioso, aqui estão as melhorias nesse código para (1) adicionar reflexão para não ter que codificar em cada formulário que você faz e (2) fazê-lo imposição automática (com apenas uma chamada para este sub na inicialização do programa). Basta colocar isso em um 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