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:
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)
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)
Exists = (Err = 0)
End Function