Peguei um bugzinho em uma implementação que eu havia feito na implementação de um operador de igualdade, e fui ver se estava com o mesmo erro em outros lugares. Encontrei uma implementação diferente para o mesmo operador. Vejam abaixo as duas.

Primeira, comparando os atributos no operador diretamente. O “<>” e o equals usam o operador “=”.

    Public Shared Operator =(ByVal siteA As WebSite, ByVal siteB As WebSite) As Boolean
        If siteA Is Nothing OrElse siteB Is Nothing Then
            Return False
        End If
        Return siteA.Id = siteB.Id AndAlso siteA.Name = siteB.Name
    End Operator

    Public Shared Operator <>(ByVal siteA As WebSite, ByVal siteB As WebSite) As Boolean
        Return Not siteA = siteB
    End Operator

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Dim site = TryCast(obj, WebSite)
        If site Is Nothing Then
            Return False
        End If
        Return site = Me
    End Function

Segunda, comparando no Equals, e os operadores usam o Equals para resolução.

    Public Shared Operator =(ByVal a As ServerEnvironment, ByVal b As ServerEnvironment) As Boolean
        If a Is Nothing OrElse b Is Nothing Then
            Return False
        End If
        Return a.Equals(b)
    End Operator

    Public Shared Operator <>(ByVal a As ServerEnvironment, ByVal b As ServerEnvironment) As Boolean
        Return Not a = b
    End Operator

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Dim dest = TryCast(obj, ServerEnvironment)
        If dest IsNot Nothing AndAlso dest.Name = Me.Name Then
            Return True
        Else
            Return False
        End If
    End Function

Interessante, não é? Talvez você esteja se perguntando porque eu faria isso. Oras, objetos de valor (“OVs” ou “VOs”) devem ser comparados pelos seus atributos, já que não possuem identidade. Nada mais justo do que sobrescrever o método Equals e já criar os operadores de igualdade.

Para quem está curioso, o bug era na linha 2 do primeiro exemplo. Eu não fazia a verificação de existência do objeto, o que resultava em uma exceção na comparação com objetos nulos.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.