C# 如何比较两个装箱变量的值?

C# 如何比较两个装箱变量的值?,c#,boxing,C#,Boxing,考虑以下代码: object a1 = (int) 2; object a2 = (long) 2; a1 == a2 //False 我知道装箱发生在这里,=操作符现在比较两个引用的相等性(a1和a2) 这里的问题是我想比较a1和a2参考值。我该怎么做 PS:在我的现实问题中,我不知道a1和a2的确切类型。它们可以是任何引用类型的值类型。最好的方法是通过将变量强制转换为它们的下标类型来解除变量的绑定 如果出于某种原因,您不知道类型,那么如果您不知道基础变量的类型,实现这一点的最简单方法是使用

考虑以下代码:

object a1 = (int) 2;
object a2 = (long) 2;
a1 == a2 //False
我知道装箱发生在这里,
=
操作符现在比较两个引用的相等性(
a1
a2

这里的问题是我想比较
a1
a2
参考值。我该怎么做


PS:在我的现实问题中,我不知道
a1
a2
的确切类型。它们可以是任何引用类型的值类型。

最好的方法是通过将变量强制转换为它们的下标类型来解除变量的绑定

如果出于某种原因,您不知道类型,那么如果您不知道基础变量的类型,实现这一点的最简单方法是使用C#中的动态语言功能


请注意,这是缓慢的,而通过显式强制转换通常可以更好地实现您想要实现的目标。

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

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

(dynamic)a1 == (dynamic)a2
在这种情况下,绑定(哪个重载?)发生在运行时,这在您的示例中应该实际起作用,因为存在重载:

bool operator ==(long, long)
内置C#

警告:绑定可能会失败,如果使用
动态
,您可能会因此遇到异常(运行时)。比如:

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


如果您不想使用
动态
,您可以尝试使用
转换.ChangeType
,前提是其中一个比较对象的类型可以更改为与另一个比较对象的类型匹配。然后你可以调用
Equals
,它是
virtual
,并将找到被重写的实现(比如
int.Equals
long.Equals
,每个被重写的
对象.Equals
)。

那么为什么
(int)2==(long)2
返回true呢?如果我不在c#4中开发,会发生什么呢?@alisabzevari,那是因为
=
操作符在
long
中重载,所以隐式转换是从
int
long
的,那么为什么他们没有在
int.Equals
long.Equals>中使用隐式转换呢?我认为这可以解决问题。@alisabzevari我能想到的不这样做的一个原因是
a1.Equals(a2)
在大多数情况下应该等价于
a2.Equals(a1)
。@alisabzevari注意,由于重载和隐式转换,如果在编译时使用实际类型,即
int a1=2;长a2=2L,那么肯定
a1。等于(a2)!=a2.等于(a1)
dynamic a1 = 2;
dynamic a2 = "two";
dynamic test = a1 == a2;  // Bang?