在谈论阴影和重载时,我知道VB.net非常奇怪,但是这个我完全感到困惑。
我正在使用类似于以下模型的模型。家长班:
Public Class Base
Function F() As String
Return "F() in Base Class"
End Function
Function F(ByVal n As Integer) As String
Return "F(" + n.ToString() + ") in Base Class"
End Function
End Class
和此:
Class Derived
Inherits Base
Shadows Function F() As String
Return "-"
End Function
End Class
运行以下内容时:
Sub Main()
Dim parent As Base = New Base()
Dim child As Derived = New Derived()
Console.WriteLine(parent.F())
Console.WriteLine(parent.F(1))
Console.WriteLine("------------")
Console.WriteLine(child.F())
Console.WriteLine(child.F(1)) 'this should not compile, due to the shadow keyword.
Console.Read()
End Sub
抛出IndexOutOfRangeException。而且,在更改时(在派生类中): 返回“ - ” 对于 返回“派生类中的Func” 控制台打印字符'u'。 有人知道这个的原因吗?
答案 0 :(得分:5)
你的F是一个字符串,所以当你指定索引时,它会查看字符串的索引,而不是带有整数参数的第二个函数。
“u”是“Func”中的第二个字符,由索引1指定。
对于您的示例,您还必须隐藏第二个函数:
Class Derived
Inherits Base
Shadows Function F() As String
Return "-"
End Function
Shadows Function F(ByVal n As Integer) As String
Return "X"
End Function
End Class
答案 1 :(得分:3)
您的代码正在索引String而不是使用参数调用函数。
Console.WriteLine(child.F(1))
此行扩展为:
Dim childFResult As String = child.F()
Dim character As Char = F.Chars(1) ' Failure here.
Console.WriteLine(character)
由于String.Chars
是默认属性,因此您可以仅通过索引引用它。您的字符串只包含一个字符,因此索引1处没有字符。
答案 2 :(得分:3)
这是vb.net中的语法歧义,()可以表示'方法调用'和'数组索引'。你得到了数组索引版本,索引1超出了F()返回的字符串的范围。或者换句话说,编译器编译它:
Console.WriteLine(child.F(1))
到此:
Dim temp1 As String = child.F()
Dim temp2 As Char = temp1(1)
Console.WriteLine(temp2)
第二个语句导致异常。 C'est la vie。