2012-03-06 45 views
2

我知道当谈论阴影和重载时,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异常。此外,在更改时(在派生类中): 返回“ - ” for 返回“派生类中的函数” 控制台打印字符'u'。 有人知道这个的原因吗?

回答

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处没有字符。

5

您的F是一个字符串,所以当您指定索引时,它将查看字符串的索引,而不是使用整数参数的第二个函数。

“U”是在“功能”的第二个字符,由索引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 
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) 

第二条语句导致异常。这就是生活。

相关问题