请考虑以下代码:
object a1 = (int) 2;
object a2 = (long) 2;
a1 == a2 //False
我知道拳击发生在这里,==
运算符现在比较两个引用的相等性(a1
和a2
)。
这里的问题是我想要比较值a1
和a2
参考。我怎么能这样做?
PS:在我的现实生活中,我不知道a1
和a2
的确切类型。它们可以是任何引用类型的值类型。
答案 0 :(得分:3)
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.Equals
或long.Equals
,每个都覆盖object.Equals
)。
答案 1 :(得分:1)
最好的方法是通过将变量转换为它们的底层类型来取消变量。
如果由于某种原因您不知道类型,如果您不知道底层变量的类型,最简单的方法是使用C#中的动态语言功能。
object a1 = (int) 2;
object a2 = (long) 2;
a1 == a2 // False
(dynamic) a1 == (dynamic) a2 // True
请注意,这种情况很慢,而且通过明确的演员表可以更好地完成您的工作。