Generics VB.Net

Option Explicit On
Option Strict On
Module Program
  Sub Main()
    Dim intPt As New Point(Of Integer)(100, 100)
    Console.WriteLine(intPt.ToString())
    Dim dblPt As New Point(Of Double)(5.6, 3.23)
    Console.WriteLine(dblPt.ToString())
    Dim p1 As New Point(Of Integer)(10, 43)
    Dim p2 As New Point(Of Integer)(6, 987)
    Console.WriteLine(p1)
    Console.WriteLine(p2)
    Swap(Of Point(Of Integer))(p1, p2)
    Swap(p1, p2)
    Console.WriteLine(p1)
    Console.WriteLine(p2)
  End Sub
  Public Function Swap(Of T)(ByRef a As T, ByRef b As T) As T
    Console.WriteLine("T is a {0}.", GetType(T))
    Dim temp As T
    temp = a
    a = b
    b = temp
  End Function
End Module
Public Structure Point(Of T)
  Private xPos, yPos As T
  Public Sub New(ByVal x As T, ByVal y As T)
    xPos = x : yPos = y
  End Sub
  Public Property X() As T
    Get
      Return xPos
    End Get
    Set(ByVal value As T)
      xPos = value
    End Set
  End Property
  Public Property Y() As T
    Get
      Return xPos
    End Get
    Set(ByVal value As T)
      yPos = value
    End Set
  End Property
  Public Overrides Function ToString() As String
    Return String.Format("({0}, {1})", xPos, yPos)
  End Function
End Structure