BT

Fazendo o 0 ser igual a 0 no C#

por Jonathan Allen , traduzido por Samuel Carrijo em 10 Jun 2009 |

C# não funciona bem com valores boxed numéricos. Diferentemente do Visual Basic, os operadores de comparação numérica como o == não funcionam com tipos boxed, mesmo quando ambos os valores são do mesmo tipo.

Variável Tipo Valor
a int 0
b decimal 0.0
c decimal 0.0
boxA boxed int 0
boxB boxed decimal 0.0
boxC boxed decimal 0.0
dynA dynamic contendo um int 0
dynB dynamic contendo um decimal 0.0
dynC dynamic contendo um decimal 0.0

Comparação C# VB
a==b true true
b==a true true
b==c true true
a.Equals(b) false <--
b.Equals(c) true <--
boxA == boxB false true
boxB == boxA false true
boxB == boxC false true
boxA.Equals(boxB) false <--
boxB.Equals(boxC) true <--
dynA == dynB true n/a
dynB == dynA true n/a
dynB == dynC true n/a

Como você pode ver, o C# 3 e versões anteriores vão considerar como diferentes, inclusive valores boxed iguais e de mesmo tipo. Isto ocorre mesmo quando o método Equals da classe Decimal retornaria true.

Felizmente, com C# 4 esses problemas podem ser evitados. Se você transformar os valores boxed em dynamic antes, você obtém o resultado correto ao comparar tipos diferentes

Avalie esse artigo

Relevância
Estilo/Redação

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Dê sua opinião
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.