views:

1716

answers:

1

In the sample code, the line with the 'error comment' gives the following the error -

  • Operator '<' is not defined for types 'T' and 'T'.

Why wouldn't VB automatically call the appropriate T operator? (i.e. If T is an integer then call the integer comparison functions.)

Is it possible to make this work in an elegant fashion?

This is for .NET 2.0.

Edit - Updated code for anyone interested.

Public Class TreeNode(Of T)
    Public Left As TreeNode(Of T)
    Public Right As TreeNode(Of T)
    Public Value As IComparable(Of T)
    Public Sub New(ByVal _value As T)
        Value = _value
    End Sub
End Class

Public Class Tree(Of T)

    Private _Root As TreeNode(Of T)

    Public ReadOnly Property Root()
        Get
            Return _Root
        End Get
    End Property

    Public Sub New()
        _Root = Nothing
    End Sub

    Public Function Add(ByVal value As IComparable(Of T)) As TreeNode(Of T)
        If _Root Is Nothing Then
            _Root = New TreeNode(Of T)(value)
        Else
            Dim node As TreeNode(Of T) = _Root
            While node IsNot Nothing
                If value.CompareTo(node.Value) < 0 Then
                    If node.Left IsNot Nothing Then
                        node = node.Left
                    Else
                        node.Left = New TreeNode(Of T)(value)
                        Return node.Left
                    End If
                Else
                    If node.Right IsNot Nothing Then
                        node = node.Right
                    Else
                        node.Right = New TreeNode(Of T)(value)
                        Return node.Right
                    End If
                End If
            End While
        End If
        Return _Root
    End Function

    Public Sub Print(ByVal node As TreeNode(Of T))
        If node IsNot Nothing Then
            Print(node.Left)
            Console.WriteLine(node.Value)
            Print(node.Right)
        End If
    End Sub

End Class
+3  A: 

Why wouldn't VB automatically call the appropriate T operator? (i.e. If T is an integer then call the integer comparison functions.)

Because there's no constraint on T that would ensure it has the appropriate operator. You could require T to be IComparable, and use it's CompareTo method.

Mark Brackett
Thanks Mark. I kept thinking C++ and operator overloading. Not sure which way is cleaner/more elegant. Guess it's a matter of language design.
You can overload operators in VB, too, but you have to tell the compiler about it to use it with a generic type.
Joel Coehoorn
@Joel - I don't think there's a generic constraint for op overload
Mark Brackett