如何比较两个盒装变量的值?

时间:2015-07-26 10:50:52

标签: c# boxing

请考虑以下代码:

object a1 = (int) 2;
object a2 = (long) 2;
a1 == a2 //False

我知道拳击发生在这里,==运算符现在比较两个引用的相等性(a1a2)。

这里的问题是我想要比较值a1a2参考。我怎么能这样做?

PS:在我的现实生活中,我不知道a1a2的确切类型。它们可以是任何引用类型的值类型。

2 个答案:

答案 0 :(得分:3)

intlong永远不会相等,所以......

要使用的==的重载在编译时是固定的。除非你说:

(dynamic)a1 == (dynamic)a2

在这种情况下,绑定(过载?)在运行时发生,这应该在您的示例中实际工作,因为存在重载:

bool operator ==(long, long)

内置于C#。

警告:绑定可能会失败,如果您使用dynamic,可能会因此而遇到异常(运行时)。类似的东西:

dynamic a1 = 2;
dynamic a2 = "two";
dynamic test = a1 == a2;  // Bang?

如果您不想dynamic,可以尝试使用Convert.ChangeType,如果任何一个比较可以更改其类型以匹配另一个类型。然后,您可以拨打Equals virtual并找到被覆盖的实施(例如int.Equalslong.Equals,每个都覆盖object.Equals)。

答案 1 :(得分:1)

最好的方法是通过将变量转换为它们的底层类型来取消变量。

如果由于某种原因您不知道类型,如果您不知道底层变量的类型,最简单的方法是使用C#中的动态语言功能。

object a1 = (int) 2;
object a2 = (long) 2;
a1 == a2 // False
(dynamic) a1 == (dynamic) a2 // True

请注意,这种情况很慢,而且通过明确的演员表可以更好地完成您的工作。