Operator Overloading and Conversions

Overloadable: + - * / \ ^ & Mod Not And Or Xor << >> = <> < > <= >= Like IsTrue IsFalse CType.

Comparison operators must be defined in pairs (=/<>, </>, <=/>=).

Public Structure Money
    Public ReadOnly Property Amount As Decimal
    Public ReadOnly Property Currency As String

    Public Sub New(amount As Decimal, currency As String)
        Me.Amount = amount
        Me.Currency = currency
    End Sub

    Public Shared Operator +(a As Money, b As Money) As Money
        If a.Currency <> b.Currency Then Throw New InvalidOperationException("Currency mismatch")
        Return New Money(a.Amount + b.Amount, a.Currency)
    End Operator

    Public Shared Operator *(a As Money, factor As Decimal) As Money
        Return New Money(a.Amount * factor, a.Currency)
    End Operator

    Public Shared Operator =(a As Money, b As Money) As Boolean
        Return a.Amount = b.Amount AndAlso a.Currency = b.Currency
    End Operator

    Public Shared Operator <>(a As Money, b As Money) As Boolean     ' = and <> must come in pairs
        Return Not (a = b)
    End Operator

    Public Shared Operator >(a As Money, b As Money) As Boolean
        Return a.Amount > b.Amount
    End Operator
    Public Shared Operator <(a As Money, b As Money) As Boolean
        Return a.Amount < b.Amount
    End Operator

    Public Shared Widening Operator CType(amoun
…