【IT168 技术文档】C#对装箱后的值类型支持的并不好。与VB不同,==这样的基本算术比较符无法在装箱后的类型上得到正确的结果,即使所比较的值属于同一类型。
| 变量 | 类型 | 值 |
|---|---|---|
| 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 holding an int | 0 |
| dynB | dynamic holding a decimal | 0.0 |
| dynC | dynamic holding a decimal | 0.0 |
| 比较 | 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 |
从上表可以看出,在C#3与之前的版本中,即使两个装箱的值都是decimal类型的,得到的也是不相等的结果,但是Decimal类的Equals方法返回的却是true。
幸好在C#4中可以避免这样的问题。你需要将装箱的值都转换为dynamic类型然后再比较,这样即使两个值本来的类型不相同,也可以得到正确的结果。
Console.WriteLine((dynamic)boxA == (dynamic)boxB);