编辑
鉴于 OP 中的新信息 - 您的问题的另一个解决方案可能是使用可选参数 - 即:
Private Shared Sub AAA(Optional ByVal str As String = Nothing)
此外 - 如果您只是更改声明的顺序,则解决方案以“正确”的方式进行 - 这避免了编译器错误:
Private Shared Sub AAA(ByVal str As String)
End Sub
Private Sub AAA()
Form1.AAA(Nothing)
End Sub
--
将其保留在下方,因为它在其他情况下可能会有所帮助
也许您的大型应用程序做了这样的事情 - VB 充满了这样的混乱,您可以让自己陷入其中。这将编译但会崩溃:
Public Class Form1
Private Shared Sub AAA()
Form1.Text = "this"
End Sub
Private Sub Label1_TextChanged(sender As System.Object, _
e As System.EventArgs) _
Handles Label1.TextChanged
Form1.AAA()
End Sub
End Class
同样,这实际上是“好的”(我用这个词很松散)......
Public Class Form1
Private Shared dont As Boolean = True
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) _
Handles MyBase.Load
dont = False
End Sub
Private Shared Sub AAA()
If Not dont Then Form1.Text = "this"
End Sub
Private Sub Label1_TextChanged(sender As System.Object, _
e As System.EventArgs) _
Handles Label1.TextChanged
Form1.AAA()
End Sub
End Class
这是因为文本更改处理程序将在 Form1 完成加载之前触发(即:期间InitializeComponent()
!)并将引用尚未完成创建的默认实例 - 因此 VB 尝试为您创建一个新实例,以便您可以调用共享方法使您陷入无限循环。
奇怪的是,Load
处理程序“很好”(再次,松散地)调用Form1.AAA()
- 就像在您的开始代码中一样 - 因为默认实例(类Form1
的实例Form1
)此时已完成创建,并且不会创建另一个以满足称呼。然而,任何其他代码路径,从共享调用开始并最终触及任何实例数据,无论路径多么曲折,都会循环并崩溃。
另请参阅:为什么在 VB.Net 中每个表单都有一个默认实例,但在 C# 中却没有?