Previous | Index | Next 

[INFO] Default methods with arguments are converted to read-only properties

VB.NET doesn’t support default fields, default methods, and default properties with zero arguments, therefore VB Migration Partner can’t emit the Default attribute when it converts either a field or a parameterless property. However, when converting a class that exposes a default method with one or more arguments, VB Migration Partner attempts to preserve the “defaultness” of that method by converting it to a readonly property. For example, consider this code inside a class named Widgets:

        ' the Item method is the default member of the Widget class
        Public Function Item(ByVal index As Long) As Widget
            Set Item = m_Items(index)
        End Function

This is how VB Migration Partner converts it:

        Default Public ReadOnly Property Item(ByVal index As Long) As Widget
            Get
                Return m_Items(index)
            End Get
        End Property

In virtually all cases this substitution has no effect on the way the Item member is used, with one exception: you can invoke a method and discard its return value, but you can’t do the same with a readonly property. For example, consider the following code:

        Dim widgets As New Widgets
        ... 
        Function Exists(ByVal index As Integer) As Boolean
            On Error Resume Next
            widgets.Item(index)
            ' return True if no error (i.e. the item exists)
            Exists = (Err = 0)
        End Function

After the migration to VB.NET the reference to the Item member causes the following compilation error:

        Property access must assign to the property or use its value.

The fix is simple, though. You just need to modify the original VB6 code so that the return value is assigned to a temporary value:

        Function Exists(ByVal index As Integer) As Boolean
            On Error Resume Next
            Dim tmp As VariantSet tmp = widgets.Item(index)
            ' return True if no error (i.e. the item exists)
            Exists = (Err = 0)
        End Function

 

Previous | Index | Next