簡體   English   中英

(對象)0 ==(對象)0

[英](object) 0 == (object) 0

我想知道為什么在C#中

0 == 0                   // return true 
(object) 0 == (object) 0 // return false

在我看來,它是在比較參考而不是在比較投射的值。

之所以出現這種情況,是因為通過反射,我得到了ValueType的默認值,該值返回一個對象,當我將其與我的對象的當前值進行比較時,它返回兩者並不相同但具有相同的值。

對ValueType對象使用Equals或ToString可以使用,但對ReferenceType不能使用,后者可以為null,因此不允許Equals或ToString。

如果有人可以告訴我如何比較可以為任何類型,為null或具有值的其他對象,因為object == object似乎是錯誤的處理方法。 在這種情況下,有義務將我的對象重鑄為原始類型嗎?

是的,將兩邊都裝箱,然后比較參考文獻。 每次裝箱時都會創建一個新對象,因此引用是不同的。

考慮到無效性,與Equals方法進行比較是必經之路。 最簡單的方法是使用靜態object.Equals(object, object)方法:

if (object.Equals(x, y))
{
    ...
}

您正在拳擊,因此“ cast”實際上確實為每個對象創建了一個NEW對象。 如果要與對象進行比較,則可能必須編寫自己的.Equals實現。

基本上,上面是創建兩個對象引用,將它們存儲在內存中的不同位置,然后比較內存地址。 由於這個原因,每次都會返回false。

比較我所知道的兩個對象的唯一方法是檢查一個或兩個對象是否為null(如果一個為null而不是另一個,則它們不相等;我將其留給您的實現來確定null == null )。 如果兩個都不為空,則可以安全地在該對象上調用.equals。

強制轉換將強制裝箱,這實際上會創建新對象,然后將引用進行比較。 如果要按內容比較對象(使用引用所指向的對象的已實現比較),則應使用Equals方法:

Console.Write(((object)0).Equals((object)0)); // outputs "True"

這可能會澄清一些事情。

對象零=(對象)0; return(object.Equals(zero,zero)); //返回true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM