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 は文字列であるため、インデックスを指定すると、整数パラメーターを持つ 2 番目の関数ではなく、文字列のインデックスが表示されます。

「u」は「Func」の 2 番目の文字で、インデックス 1 で指定されます。

あなたの例では、2 番目の関数もシャドウする必要があります。

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文字しか含まれていないため、インデックス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)

2 番目のステートメントで例外が発生します。C'est la vie.

于 2012-03-07T01:08:20.773 に答える