2016-10-02 86 views
2

我無法理解,爲什麼下面圖片中的if語句返回false。我希望你能解釋給我。if(<object> == <int>)

您可以看到,兩個變量的值和鍵盤都是相同的。

enter image description here

+0

請給我們提供更多的細節。在這種情況下,「價值」是什麼? –

回答

2

==操作您呼叫的是,有兩個object參數過載。這使用引用相等 - 值並不重要,它必須是相同的對象。

正如你在讀the documentation

對於字符串以外的引用類型,== 返回true,如果兩個操作數指的是同一個對象。對於字符串類型,==比較字符串的值。

雖然int爲值類型,它一直'boxed'(包裝在一個object)。您正在比較包裹整數的兩種不同參考類型。

要解決這個問題,您可以使用object.Equals來代替 - 這將比較兩個整數。

item.Equals(value); 

或者靜態方法(這將處理的情況下item == null):

object.Equals(item, value); 

如果拆箱到int那麼你可以像您期望使用int超載==

(int)item == (int)value; 

同樣,根據文檔:

對於預定義的值類型,如果操作數的值相等,則相等運算符(==)返回true。

0

問題是您正在比較的兩個對象包裝int是不同的對象。

由於object不會覆蓋==Equals通話,比較檢查,而不是引用,並返回false,因爲這兩個對象是不同的。

您可以使用object.Equals(item, value)來避免此問題。

0

當您將int投射到object時,您正在創建一個新對象。這被稱爲拳擊

任何比較都將是一個對象比較。通過對象,==運算符將檢查引用是否相同。它不會檢查兩個變量引用等價對象,它會檢查兩個變量是否引用一個對象。

如果你想執行一個int比較,你必須將它轉換回一個整數(取消它)。

或者,您可以使用Equals而不是==運算符。

這裏的一個代碼段,其演示此:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     int n = 3; 
     object o1 = n; 
     object o2 = n; 
     Console.WriteLine("o1 == o2 is {0}", o1 == o2); 
     Console.WriteLine("o1.Equals(o2) is {0}", o1.Equals(o2)); 
     Console.WriteLine("(int)o1 == (int)o2 is {0}", (int)o1 == (int)o2); 

    } 
} 

輸出:

O1 O2 ==爲False

o1.Equals(O2)爲True

(int)o1 ==(int)o2 is True

0

通常情況下,當你比較兩個整數,你比較它們的值:

int a = 5; 
int b = 5; 
if (a == b) { // true 

爲什麼?因爲衆所周知,Int32是一種價值型!

但是你的情況是不同的。您正在比較兩個object s。 Object是一個參考類型。當您將兩個參考類型與==運算符進行比較時,您將比較參考指向的內存位置,而不是這些值是否相等。 「

」等等!但實際上對象是int s!這是怎麼發生的?「你問。

是的我知道他們實際上存儲整數。但是,當你寫這樣的事:

object o = 10; 

該整數是盒裝成一個對象!您可以將它想象爲指向數字10的指針。

在您的代碼中,您的item變量和value變量指向內存中不同的「3」。這就是爲什麼if語句評估爲false。

相關問題