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