我在VB.NET中偶然发现了一些看起来不应该编译的东西:
Private Structure SomeStruct
Friend ReadOnly Property Text1 As String
Friend ReadOnly Property Text2 As String
Friend ReadOnly Property Text3 As String
Friend Sub New(text2 As String, Optional text3 As String = Nothing)
Me.New(Nothing, text2, text3)
End Sub
Friend Sub New(text1 As String, text2 As String, Optional text3 As String = Nothing)
Me.Text1 = text1
Me.Text2 = text2
Me.Text3 = text3
End Sub
End Structure
以上不仅能够编译,而且还可以在外部代码中编译:
Dim structs As SomeStruct() = {New SomeStruct("Argument1", "Argument2")}
在上面的行中,这两个字符串的构造函数似乎不明确。这不应该是可能的 - 尤其是上面的一行实际上是从结构外部调用构造函数 - 但它编译得很好。 (我使用VS2015和.NET 4.5。)
允许这个的任何体面的编译器都会在哪个构造函数中将外部代码中的两个字符串参数映射到一致,但为什么首先允许这样做?这是语言定义中的一个缺口,它让不同的编译器自行决定(像.NET和Java这样的东西应该是而不是那么好)?这是设计语言吗?是否存在Microsoft选择的一致规则,或者这只是一个简单的错误?
对此有何解释?
答案 0 :(得分:2)
看起来VB尝试首先匹配参数的数量,因为它会调用2参数构造函数。
即使我猜你可以说它们不明确,但有一种方法可以通过将第三个参数留空来调用第二个构造函数。
New SomeStruct("foo", "bar",) 'Notice the extra comma.
我不喜欢这个允许的想法,但对我来说这更像是一个VB gotcha ,因为有办法调用所需的构造函数。