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

How to compare value of two boxed variables?

考虑以下代码:

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

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

这里的问题是我想比较a1a2所指的值。我该怎么做?

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

最好的方法是通过将变量强制转换为底层类型来取消装箱。

如果由于某种原因您不知道类型,并且不知道基础变量的类型,实现此目的的最简单方法是使用 C# 中的动态语言功能。

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

请注意,这很慢,您通常可以通过显式转换更好地完成您想要实现的目标。

一个int和一个long永远不相等,所以...

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

(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)。