2009-09-01 12 views
1

Visual Basicには、式を評価するときに暗黙的に呼び出される既定のプロパティがあります。しかし、私はこのデフォルトのプロパティの暗黙の実行と矛盾しているようです。プロジェクトのレイアウトは次のようになります。Visual Basic 6組み込み関数の既定のプロパティ

のClass1:

property test -> class2 (default) 

クラス2:

property test -> string "hello world" (default) 

をForm1:

Dim x As New Class2 
MsgBox x 
Debug.Print x 

MsgBox文は暗黙のうちにxのデフォルト(class1のテスト)を呼び出し、さらにその上でdefault(クラス2のテスト)を呼び出し、 "hello world"が画面に表示されるようにします。 Debug.Printステートメントはこれを行いませんが、デバッガーに続いて、最初のデフォルト(class1上)のみが呼び出されていることがわかります。

MsgBox/RTrim/LTrimなどの組み込み関数の多くがこの動作を示し、自己記述型のメソッドやクラスメソッドがこれをしないことを確認しました。なぜこれが起こるのか分からないのですか?

答えて

4

これはビルトイン関数の「動作」ではありませんが、COMがオブジェクト参照とバリアントを文字列に変換する方法によって異なります。これには、Set and Let languageキーワードと式評価、特にかっことの関連もあります。参照(IDispatchの1)を含むバリアントが(うまく投げている間に、文字列へのオブジェクト参照をキャストすると、コンパイル時エラー(CSTR(x)の呼び出し)がどのように

Private Sub Form_Load() 
    Dim x As Class1 
    Dim v As Variant 
    Dim s As String 

    Set x = New Class1 
    Set v = x ' None 
    Let v = x ' Once 
    Set v = (x) ' Once 
    Let v = (x) ' Twice 
    's = x  ' Compile error: Type mismatch 
    Set v = x 
    s = v  ' Twice 
    s = CVar(x) ' Twice 
    MsgBox x 
    'Debug.Print CStr(x) ' Compile error: Type mismatch 
    'Debug.Print CVar(x) ' Run-time error: Type mismatch 
    Debug.Print CStr(CVar(x)) ' Twice 
    pvTest1 x 
End Sub 

Private Function pvTest1(ByVal o As Variant) 
    'Debug.Print o  ' Run-time error: Type mismatch 
    Debug.Print CStr(o) ' Twice 
End Function 

注意:このサンプルコードを考えてみましょうs = v)。この最後の割り当ては、デフォルトのプロパティがIDispatch(DISPIDが-1に設定されたInvokeを呼び出す)と評価される間に、デフォルトのプロパティを深く「展開」します。

要約:オブジェクトへの参照があり、デフォルトプロパティを再帰的に「プリミティブ」データ型(文字列など)の値に評価する必要がある場合は、CStr(CVar(x))(またはCInt 。)など)

関連する問題