2010-11-17 92 views
3

假设我有以下的,完全没有意义的代码:如何在.NET中比较两个相等的方块数?

object val1 = 1; 
object val2 = 1l; 

下面将返回false,因为两个盒装对象是不一样的,因为他们的对象有不同的类型:

val1 == val2 

这同样适用于:

val1.Equals(val2) 

或者:

Object.Equals(val1, val2) 

什么是用同样的方法来比较这些的下面会,考虑到我不知道类型在运行时(因此不能投)最简单的方法:

1 == 1l; 

在换句话说,我如何得到一个基于两个盒装数字比较?

+0

不确定我明白。无论你如何编写表达式,为什么1 == 11都会返回true? – JohnFx 2010-11-17 17:36:39

+1

它是(int)1 ==(long)1。他至少使用了一个L,而不是额外的1 – used2could 2010-11-17 17:38:44

+0

,至少他们是否总是会成为某种形式的数字? (数字作为标签) – used2could 2010-11-17 17:41:17

回答

4

尝试使用动态关键字。它会将对象解析为您的值类型,以便您可以使用==运算符并比较真实值:

(dynamic)val1 == (dynamic)val2 
1

如果你不知道这个类型,那么我认为你必须做一些反思来找出需要比较数据的手段。

+1

请注意OP说:“我不知道运行时的类型(因此无法投射)” – Greg 2010-11-17 17:30:55

+1

在发布此消息后,他更新了他的问题。 – used2could 2010-11-17 17:50:19

+0

同样发生在我身上 – Basic 2010-11-17 17:52:13

3

如果它是一种特定类型的对象,您可以使用.Equals()方法来检查相等性 - 支持它的标准.Net类型之一或将其添加到您自己的对象中。

如果做不到这一点,你可以将它们转换为已知类型,如果你事先知道它会

从cdhowie那么好点...

我可能失去了一些东西,但你知道他们”除非你有一些自定义类型来存储数字,否则你不能简单地将所有内容都转换为Long(或者只有在+ ve时才是ULong),然后再比较一下吗?

+0

-1实际上并没有回答这个问题。 (OP询问如何在事先未知类型时比较相等性,并且还指出'.Equals()'方法不适用于不同类型的盒装数字。) – cdhowie 2010-11-17 17:34:03

+0

@cdhowie好点 - 答案已更新。 – Basic 2010-11-17 17:49:21

+0

K,downvote被删除了,但是我想指出几件事情:(1)投到'long'不会总是有效(如果盒装数字是一个“double”和一个“float”组件?)和(2)'.Equals()'不会总是工作。例如,这返回false! '1.Equals(1L);' – cdhowie 2010-11-17 17:51:27

0

我在System.ValueType.Equals接过来一看(OBJ,OBJ)

然而,使用反射,你可以看到,这个方法具体返回false如果类型不匹配。

你可以尝试扩展你自己的方法,比如说,object.ValueEquals(obj,obj),使用来自Reflector的代码并消除该检查。

值得一试我会说。