Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Erro sobre conversão de DBNull

Boa noite,

Estava testando a sobrescrita do método Equals() na classe Conta:

public override bool Equals(object obj)
        {
            Conta conta = (Conta) obj;
            return this.Gerente == conta.Gerente;
        }

E o gerava um erro de compilação na linha do cast dizendo que não é possível converter um objeto do tipo DBNUll em um objeto do tipo Conta. O teste que fiz foi similar ao que foi feito durante as aulas. Poderiam me explicar o que houve ?

9 respostas

Olá Lucas.

Você deve estar passando o objeto de forma errada quando chama o método Equals(). Você pode passar aqui o código da classe onde utiliza o Equals().

De antemão, você pode adicionar uma verificação de objeto nulo ou DBNull no início do método Equals():

public override bool Equals(object obj)
 {
    if(obj == null || obj == DBNull.Value)
        return false;

    Conta conta = (Conta) obj;
    return this.Gerente == conta.Gerente;
 }

Note que isso forçará um retorno falso no caso de objeto nulo ou DBNull e pode te trazer dificuldades para saber se o false quer dizer que os objetos não são iguais por conta de alguma propriedade for diferente ou porque você passou algo nulo. O tratamento precisará ser corrigido na chamada do Equals().

Obrigado pela resposta Bruno.

Antes da chamada do método eu simplesmente instanciei duas contas, defini a propriedade Gerente de ambas e utilizei o método Equals:

var c1 = new Conta();
c1. Gerente = "Maria";

var c2 = new Conta();
c2.Gerente = "Maria";

var check = c1.Equals(c2);

Ali em c1.Gerente tem um espaço? Bom, no seu código deve estar correto, senão o compilador reclamaria e não te deixaria executar o código.

Enfim, essa propriedade Gerente é do tipo string? Pode passar sua classe Conta inteira aqui?

Classe Conta

class Conta : IConta
    {
        public string Gerente { get; set; }
        public int Numero { get; set; }
        public Cliente Titular { get; set; }
        public double Saldo { get;  set; }

        public override bool Equals(object obj)
        {
            Conta conta = (Conta)obj;
            return this.Gerente == conta.Gerente;
        }
}

Chamada do método Equals()

private void button1_Click(object sender, EventArgs e)
        {
            var c1 = new Conta();
            c1.Gerente = "armando";

            var c2 = new Conta();
            c2.Gerente = "armando";

            MessageBox.Show(c1.Equals(c2).ToString());

        }

Cara, aparentemente está tudo ok. Você ainda está tendo esse erro?

Haha pois é !! Pior que estou e não estou entendendo o motivo. Pois eu instancio o objeto e passo como parâmetro.

Pior que eu nem consigo debugar. Pois o projeto nem executa. Quando clico no "play" do VS, ele aponta o erro.

solução!

Tá no GitHub? Se eu ver o projeto, acho que mato isso rapidão. Ou um zip do projeto rs.

Muito obrigado pela atenção Bruno. A minha classe Form1 estava com um monte de código das lições do curso. Pois eu baixei o projeto novamente em determinado ponto.

Não sei o que houve mas eu simplesmente apaguei a maioria do código e deixei somente o código do método Form1_Load e a aplicação voltou a funcionar normalmente.

Que bom. Eu queria justamente ver o projeto porque já imaginava que tinha sujeira em algum lugar.

Abraço.