-1

VB.NET で次のコードを記述しました。

  Dim obj As Object
    obj = "00"
    Test(obj)
    MsgBox(obj)


Private Sub Test(ByRef num As Integer)

End Sub

Private Sub Test(ByVal num As Integer)

End Sub

メソッド「Test」で値「00」が「ByRef」に渡されると、0 に変換されます。ただし、値「00」が「ByVal」に渡されると、「00」と同じ値が保持されます。署名のみに応じて、渡された値がどのように変換されていますか?
VB6 では、デフォルトの受け渡しタイプは "ByRef" ですが、同じコードは同じ値 ("00") を保持します。

VB6 と VB.NET におけるこの矛盾した動作の背後にある理由を説明できる人はいますか?

4

3 に答える 3

1

オブジェクトは System.String 型です。ByRef をメソッドに渡すことはできません。型が間違っています。したがって、コンパイラはそれを回避し、コードを書き直す必要があります。

Dim obj As Object
obj = "00"
Dim $temp As Integer
$temp = CInt(obj)
Test($temp)
obj = $temp                 '' <=== Here
MsgBox(obj)

示されたステートメントは、オブジェクトを文字列から整数に変更するステートメントです。これは、MsgBox() 呼び出しによって再び文字列に変換され、「00」ではなく「0」を生成します。

C# ではこれが許可されておらず、コンパイル エラーが発生することに注意してください。メソッド自体が元のオブジェクトを変更すると、渡された引数の値が変更されないため、何が起こっているのかを推測するのが非常に難しくなります。

于 2013-05-27T19:56:03.583 に答える