【发布时间】:2013-12-12 03:02:30
【问题描述】:
我发现了 VB.NET 如何处理函数签名的一些有趣行为。这种新行为始于 VS2012,并在 VS2013 中持续存在。
考虑以下代码段:
Class test
Function a(x As String, Optional y As Boolean = False) As String
Return "function a() was called"
End Function
Function a(x As String) As String
Return "second function a() was called"
End Function
End Class
我的第一个想法是这不会编译,这在VS2010及更早的版本中都是如此。但是,VS2012 和 VS2013 编译代码时甚至没有警告。如果您随后运行以下命令:
Dim x As New test()
MsgBox(x.a("123"))
消息表明调用了不带可选参数的函数。
有没有办法关闭这种行为?看起来这可能会为开发人员打开大门,让他们在不知不觉中添加与其他具有可选参数的函数同名的函数,从而导致不需要的重定向。
【问题讨论】:
-
您应该真正放弃使用
MsgBox函数的习惯,该函数仅出于兼容性原因从旧的VB6 代码迁移。System.Windows.Forms.MessageBox.Show(...)是要走的路。 -
正如 David R 在他的回答中提到的,C# 具有相同的行为。因此,如果此更改消除了 VB.NET 和 C# 之间的差异,我认为这是一个很好的更改。
-
当您提供重载时,该参数不再是可选的。编写合理的代码,所有的部分都会到位。
-
@AndreasAdler 我同意,让 VB.NET 更接近 C# 是一件好事。我仍然会认为它是一个歧义错误,但至少它现在在两种语言之间是统一的。
标签: vb.net visual-studio-2012 overloading visual-studio-2013 optional-parameters