C#对装箱后的值类型支持的并不好。与VB不同,==这样的基本算术比较符无法在装箱后的类型上得到正确的结果,即使所比较的值属于同一类型。
从上表可以看出,在C#3与之前的版本中,即使两个装箱的值都是decimal类型的,得到的也是不相等的结果,但是Decimal类的Equals方法返回的却是true。
幸好在C#4中可以避免这样的问题。你需要将装箱的值都转换为dynamic类型然后再比较,这样即使两个值本来的类型不相同,也可以得到正确的结果。
Console.WriteLine((dynamic)boxA == (dynamic)boxB);
| 变量 | 类型 | 值 |
| 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);
本文探讨了C#中装箱后的值类型比较问题,特别是decimal类型的表现,并对比了VB.NET的行为。在C#3及以前版本中,直接比较装箱后的值类型可能会导致错误的结果。文章介绍了如何通过使用dynamic类型来解决这一问题。

被折叠的 条评论
为什么被折叠?



