回答
的==
操作您呼叫的是,有兩個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。
問題是您正在比較的兩個對象包裝int
是不同的對象。
由於object
不會覆蓋==
與Equals
通話,比較檢查,而不是引用,並返回false
,因爲這兩個對象是不同的。
您可以使用object.Equals(item, value)
來避免此問題。
當您將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
通常情況下,當你比較兩個整數,你比較它們的值:
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。
- 1. <!>例外:if(outOfBound)dialog.close();
- 2. Puppet中'if $ variable {}'的意思是什麼?</p> <pre><code>if $variable { do something } </code></pre> <p>這是什麼意思:
- 3. operator <<:std :: cout << i <<(i << 1);
- 4. Python的文件內容 <p>two.py</p> <pre><code>if any(data): print data validate() random() </code></pre> <p>結果:</p> <pre><code>if any(data): print data print data validate() random() </code></pre> <p>是可能</p>
- 5. If TextBox.Value =(「」,<0,> 1,OR <>「x」)Then
- 6. 看來「IE = EmulateIE7」也會使「<! - [if lt IE 8]>」爲真?
- 7. If true:render <tr>,else:do not render that <tr>
- 8. 「<! - [if IE X]><![endif] -->」應用了些什麼?
- 9. if語句不<code>FirebaseDatabase</code>返回從火力
- 10. << <<超載
- 11. 我可以說如果(4 <$ a <44)而不是if(4 <$ a && $ a <44)? (php)
- 12. 使用>>,>,> |,||,| <,<,<<,<<
- 13. PHP - 不是運營商,還有別的別名?</p> <p><code>if(not($whatever && what()) do_stuff...</code></p> <p>:
- 14. 'for'vs.'in' - 哪個更快?</p> <pre><code>if "foo" in a_list: do stuff </code></pre> <p>它是:
- 15. 如何當我在使用的onPause</p> <pre><code>if(mp!= null && mp.isPlaying()){ mp.stop(); } </code></pre> <p>停止屏幕鎖
- 16. 禁用<a class button if input fields empty
- 17. 在IF語句中意外的'<='R
- 18. VHDL - if <語句不起作用
- 19. if-statement body height <100%javascript/jquery
- 20. MySQL IF版本<x然後我的
- 21. C#(如果< or If >)與Math.Sign
- 22. 從Maven-Antrun-Plugin調用<if>
- 23. if <> ...我缺少什麼
- 24. Freemarker:意外的指令,「</#if>」
- 25. 從SQL到PHP的值<!-- IF -->
- 26. <%= %>嵌入JavaScript的IF條件
- 27. 用wordpress做if語句<?php the_permalink(); ?>
- 28. 的Rails搞亂我的代碼以「<<<<<<< HEAD」
- 29. 什麼意思的符號在java中「<<<」「<< =」「<<」
- 30. <%$,<%@,<%=,<%#...這是怎麼回事?
請給我們提供更多的細節。在這種情況下,「價值」是什麼? –