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