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。此外,当更改(在派生类中)时:返回“-”以返回“派生类中的函数”控制台打印字符“u”。有人知道这是什么原因吗?

4

3 回答 3

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
于 2012-03-07T00:15:58.797 回答
3

您的代码正在索引字符串,而不是调用带有参数的函数。

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

于 2012-03-07T00:40:35.073 回答
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)

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

于 2012-03-07T01:08:20.773 回答