Тени ведут себя странно при использовании в функции - PullRequest
2 голосов
/ 07 марта 2012

Я знал, что 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 в производном классе" консоль печатает символ «и». Кто-нибудь знает причину этого?

Ответы [ 3 ]

5 голосов
/ 07 марта 2012

Ваш 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
3 голосов
/ 07 марта 2012

Это двусмысленность синтаксиса в 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.

3 голосов
/ 07 марта 2012

Ваш код индексирует строку, а не вызывает функцию с параметром.

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 нет символа.

...