Note: this article only applies to conversions to VB.NET.
Let’s  say that ICollection is a VB6 class that defines the interface of an enumerable  collection, usually consisting of the four members Item, Count, and NewEnum:
        
        Public Property Get Item(ByVal index As Variant) As Widget
        End Property
        Public Function NewEnum() As stdole.IUnknown
        End Function
        Public Property Get Count() As Long
        End Property
VB  Migration Partner correctly converts this code to VB.NET:
        <VB6Object("MyProject.ICollection")> _
        Public Interface ICollection
            <System.Runtime.InteropServices.DispId(0)> _
            Default ReadOnly Property Item(ByVal index As Object) As Widget
            <System.Runtime.InteropServices.DispId(-4)> _
            Function NewEnum() As IEnumerator
            ReadOnly Property Count() As Integer
        End Interface
The  problem with previous code is that the ICollection interface can’t really  define a collectionclass-like interface, because all .NET collection classes  must implement the Collection.IEnumerable interface. You must therefore force  VB Migration Partner to generate a proper Inherits clause, which you do by  adding the following pragma inside the VB6 code:
The  generated code now becomes:
        <VB6Object("MyProject.ICollection")> _
        Public Interface ICollection
            Inherits IEnumerable
			
            <System.Runtime.InteropServices.DispId(0)> _
            Default ReadOnly Property Item(ByVal index As Object) As Widget
            <System.Runtime.InteropServices.DispId(-4)> _
            Function NewEnum() As IEnumerator
            ReadOnly Property Count() As Integer
        End Interface
So  far so good. Next, let’s say that you have a VB6 class named Widgets that  implements the ICollection interface.
        Implements ICollection
        Private colObjs As New Collection
        Friend Property Get ICollection_Item(ByVal index As Variant) As Widget
            Set ICollection_Item = colObjs(index)
        End Property
  
        Friend Function ICollection_NewEnum() As stdole.IUnknown
            Set ICollection_NewEnum = colObjs.[_NewEnum]
        End Function
  
        Friend Property Get ICollection_Count() As Long
            ICollection_Count = colObjs.Count
        End Property
Here’s  the code that VB Migration Partner generates for this class:
        <VB6Object("MyProject.Widgets")> _
        Public Class Widgets
            Implements ICollection
			
            Private colObjs As New Collection
			
            Friend ReadOnly Property ICollection_Item(ByVal index As Object) As Widget _
                       Implements ICollection.Item
                Get
                    Return colObjs.Item(index)
                End Get
            End Property
			
            Friend Function ICollection_NewEnum() As Object Implements ICollection.NewEnum
                Return colObjs.GetEnumerator()
            End Function
            Friend ReadOnly Property ICollection_Count() As Integer Implements ICollection.Count
                Get
                    Return colObjs.Count
                End Get
            End Property
        End Class
The  previous code suffers from two problems, both of which cause a compilation  error. First, VB Migration Partner converts the stdole.IUnknown type to Object  rather than to IEnumerator. Second, the NewEnum function must implement also  the IEnumerable.GetEnumerator member.
It’s  easy, however, to fix this problem by means of a PostProcess pragma:
which  caused the following code to be generated for the NewEnum method:
        Friend Function ICollection_NewEnum() As IEnumerator _
                    Implements IEnumerable.GetEnumerator, ICollection.NewEnum
            Return colObjs.GetEnumerator()
        End Function