Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro arquivos da aula "Mão na Massa - Formulários" - Método Equals

Durante a aula referente a formulários, utilizei os fontes disponíveis para a aula, sendo que o mesmo lançava uma exceção ao realizar a build;

Assim estava o método:

        public override bool Equals(object obj)
        {
            if(obj != null) {

                Conta outra = (Conta)obj; // Exceção aqui

                bool numero = (this.Numero == outra.Numero);
                bool titular = (this.Titular.Equals(outra.Titular));

                return numero && titular;
            }
            else
            {
                return false;
            }
        }

Exceção lançada:

System.InvalidCastException: 'Unable to cast object of type 'System.DBNull' to type 'Caelum.CaixaEletronico.Modelo.Contas.Conta'.'

Entendi que é referente ao Cast que está sendo realizado ali para um tipo diferente de objeto, entretanto não soube como evitar o mesmo, após pesquisar na internet encontrei esse tópico da MSDN em inglês onde deu uma explicação e forma de evitar o lançamento de exceção;

O método equals ficou assim:

        public override bool Equals(object obj)
        {
            if(obj != null) {

                // Implementação para evitar a exceção; 
                if (this.GetType() != obj.GetType())
                    return false;

                Conta outra = (Conta)obj;

                bool numero = (this.Numero == outra.Numero);
                bool titular = (this.Titular.Equals(outra.Titular));

                return numero && titular;
            }
            else
            {
                return false;
            }
        }

A dúvida que ficou é sobre a implementação correta do Equals, sempre vou ter que fazer as duas validações acima? Evitar que o objeto seja nulo e que ele seja do mesmo tipo da classe? Ou isso é uma convenção antiga e hoje é feito de forma diferente?

1 resposta
solução!

Oi Lucas,

O melhor código para isso é usando o operador is:

public override bool Equals(object obj)
{
    if(!(obj is Conta))
        return false;

    Conta outra = (Conta)obj;

    bool numero = (this.Numero == outra.Numero);
    bool titular = (this.Titular.Equals(outra.Titular));

    return numero && titular;
}

O código fica até mais enxuto. Com o is você não precisa testar o null. Se for null, não é uma instância de Conta de qualquer forma, então, não é igual (false).