2011-10-27 41 views
6

當我投入int並浮動到對象並比較它們時,相等總是爲false。爲什麼?爲什麼equals在物品投射到物體時不能正常工作?

 float f = 0.0f; 
     int i = 0; 
     Console.WriteLine(f.Equals(i)); // true 
     Console.WriteLine(i.Equals(f)); // false 
     Console.WriteLine(i == f); // true 
     Console.WriteLine("----------------"); 
     object obf = f; 
     object obi = i; 
     Console.WriteLine(obf.Equals(obi)); // false 
     Console.WriteLine(obi.Equals(obf)); // false 
     Console.WriteLine(obi == obf); // false 
     Console.WriteLine("----------------"); 

更新: 這不是同一類型

 int i1 = 1; 
     int i2 = 1; 
     object oi1 = i1; 
     object oi2 = i2; 
     Console.WriteLine(oi1.Equals(oi2)); // true 
     Console.WriteLine(oi2.Equals(oi1)); // true 

回答

10

float僅等於另一個floatint僅等於另一個int。這是返回true唯一的行是這些的:

Console.WriteLine(f.Equals(i)); 
Console.WriteLine(i == f); 

在這兩種情況下,還有的ifloat價值的隱式轉換,所以他們等同於:

Console.WriteLine(f.Equals((float) i)); 
Console.WriteLine((float) i == f); 

這些轉換隻是方法和運算符重載解析所需的常規轉換。

無行的其餘部分都涉及隱式轉換,所以他們比較兩個不同的類型,它給出了false結果即使的值進行比較(這是與所有的Equals的情況下調用)。這就是爲什麼在盒裝int上使用Equals確實是返回true,因爲這是比較相同類型的兩個值,的值爲

在這種情況下:

Console.WriteLine(obi == obf); 

它甚至沒有試圖比較數值 - 這是比較引用的盒裝對象。由於有兩個不同的參考,結果是false - 即使這兩個值都是int類型也是如此。

+0

是否在編譯時處理隱式轉換? –

+0

@CharlesLambert:是的。看看IL,你會看到它正在執行。 –

0

當你施放一個值類型爲對象,它實際上是把頭髮在堆和的情況下==那個比較引用點,這將是錯誤的。 (簡體)

0

因爲Equals比較對象引用的地址和兩個數字存儲在不同的位置。如果比較兩個值類型,則Equals的行爲正確,因爲它已被重寫爲float,int,string和其他類型。

0

因爲他們被分配到不同的memeory單元格。 2個對象=只有當它們是同一個對象時。 在float和int部分中,當您測試2個變量時會得到true,因爲運行時會檢查它們的值。這就是全部!

1

當你定義了兩個對象,他們引用了一個不同的內存位置:

object obf = f;   // this simplified as new float(f) 
object obi = i;   // this simplified as new int(i) 

但嘗試之後,讓一個對象引用其他:

obf = obi; 
Console.WriteLine(obf.Equals(obi)); 

MSDN,Object.Equals Method

Equals的默認實現支持參考等於 引用類型,以及值類型的按位相等。參考 相等意味着被比較的對象引用指的是同一對象的 。按位相等意味着被比較的對象具有相同的二進制表示。

3

其他人已經解釋了爲什麼==在您的對象上無法正常工作。

關於您的編輯:oi1.Equals(oi2)作品,因爲Equals是一個虛函數,因此,Int32.Equals(object)被調用,其返回值定義如下:

真正如果obj的Int32和平等的一個實例這個實例的價值;否則,虛假

這也解釋了爲什麼obi.Equals(obf))返回false:obf不是的Int32的實例。

1

要了解更多有關在框的值類型會發生什麼,Shivprasad介紹這個相當簡潔這裏:

Boxing and Unboxing

因爲你是拳擊值類型的對象,你現在執行基準平等。由於他們現在駐留在您的示例中的不同內存位置,將返回false。