Imports System
Imports System.IO

Module Module1

    Sub Main()
        ' Tworzymy instancję GenericList i wybieramy typ (w tym przypadku String)
        Dim List As New GenericList(Of String)

        ' Dodajemy dwa łańcuchy
        List.Add("niebieski")
        List.Add("zielony")

        ' Następna instrukcja nie zadziała, ponieważ dodaje do kolekcji błędny typ.
        ' Nie można automatycznie przekształcić identyfikatora GUID w łańcuch.
        ' Prawdę mówiąc, wiersz ten nie zostanie nigdy wykonany, ponieważ kompilator
        ' wykryje problem i odmówi zbudowania aplikacji.
        'List.Add(Guid.NewGuid())

        ' Ta niestandardowa kolekcja nadal obsługuje wyliczanie:
        For Each Item As String In List
            Console.WriteLine(Item)
        Next
        Console.ReadLine()

    End Sub

End Module

Public Class GenericList(Of ItemType)
    Inherits CollectionBase

    Public Function Add(ByVal value As ItemType) As Integer
        Return List.Add(value)
    End Function

    Public Sub Remove(ByVal value As ItemType)
        List.Remove(value)
    End Sub

    Public ReadOnly Property Item(ByVal index As Integer) As ItemType
        Get
            ' Odpowiedni element jest pobierany z obiektu List i jawnie
            ' rzutowany na odpowiedni typ, a następnie zwracany
            Return CType(List.Item(index), ItemType)
        End Get
    End Property
End Class
