PRB: Operators Do Not Recursively Call Object Default Properties

ID: Q194368

The information in this article applies to:

SYMPTOMS

In Visual Basic 5.0, the following code will call the default property of obj:

   Dim obj As Object
   If obj = 5 Then


If the Object's default property returns an object, it recursively calls the default property of that object until it finally finds a non-object property.

Visual Basic 6.0 only invokes the default property of the second level, at most. If it is also an object, Visual Basic 6.0 will throw a "Type Mismatch" error.

CAUSE

The way the comparison operators (=, >, <, etc.) evaluate objects has been changed in Visual Basic 6.0.

NOTE: The behavior of Visual Basic 5.0 in this case is undocumented and programmers should not rely on this feature.

RESOLUTION

1. Add the following function to your project:

      Public Function EvaluateObjToLong(obj As Object) As Long
         EvaluateObjToLong = obj
      End Function

2. Replace the following line:

      if obj = 5 then

   with:

      if EvaluateObjToLong(obj) = 5 then

Please note that this is only a workaround for migrating from Visual Basic 5.0 to Visual Basic 6.0. Programmers should not rely on this feature. The recursive evaluation of the default property of the assignment operator may be changed in future versions.

STATUS

This behavior change is by design. The reasons for this are:

MORE INFORMATION

Steps to Reproduce Behavior

1. Create a new ActiveX DLL project in Visual Basic 5. Class1 is created by

   default.

2. From the Project menu, add two additional classes named Class2 and
   Class3 to the project.

3. Add following code to Class1:

      Public Property Get DefProp() As Object
         Set DefProp = New Class2
      End Property

4. Select Procedure Attributes from the Tools menu. In the dialog box,
   click the "Advanced >>" button, and change Procedure ID to "<Default>."

5. Add the following code to Class2:

      Public Property Get DefProp() As Object
         Set DefProp = New Class3
      End Property

6. Set the DefProp of Class2 to be the default property, as in step 4.

7. Add the following code to Class3:

      Public Property Get DefProp() As Long
         DefProp = 5
      End Property

8. Set the DefProp of Class3 to be the default property, as in step 4.

9. From the File menu, add a Standard EXE project to the project group as

   Project2. Form1 is created by default. Set Project2 as the start up
   project.

10. Add the following code to the General Declarations section of Form1:

      Public Function EvaluateObjToLong(obj As Object) As Long
         EvaluateObjToLong = obj
      End Function

      Private Sub Form_Load()
         Dim obj As Object
         Set obj = CreateObject("project1.Class1")
         If obj = 5 Then MsgBox "work"
      End Sub

11. Press the F5 key to run the project, and note that a message box
   displays the word "work."

12. Stop the project and save the project group.

13. Open the project group in Visual Basic 6.0 and run it. The following

   error message will be displayed:

      Run Time Error '13':
      Type Mismatch

14. Change the line:

      If obj = 5 Then MsgBox "work"

   to:

       If EvaluateObjToLong(obj) = 5 Then MsgBox "work"

15. Run the project again, and note that the Message box displays "work."

Additional query words: kbDSupport kbDSD kbVBp kbVBp600 kbActiveX kbVBp500

Version           : WINDOWS:6.0
Platform          : WINDOWS
Issue type        : kbprb

Last Reviewed: October 16, 1998