【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);