2010-11-17 33 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的代碼並消除該檢查。

值得一試我會說。

相關問題