2016-09-13 77 views
0

當在DataGridViewRow迭代的DataGridViewCell個集合,我在測試特定小區的平等,像這樣:DataGridViewCell類型不匹配,當GetType()。名稱匹配?

var transactionLogId = dataGridView1.Rows[dataGridView1.SelectedCells[0].RowIndex].Cells[0].Value; 
if (dgvRow.Cells[0].Value == transactionLogId) { 
    // Snip 
} 

而且我失望的是,它從未進入嵌套塊。儘管兩者相同(5177518),並且dgvRow.Cells[0].Value.GetType().NametransactionLogId.GetType().Name都是Int64,但它不起作用,除非在等式檢查的兩端附加.ToString()

好奇,我在這裏失蹤。謝謝!

回答

3

運算符是靜態調用,這意味着重載解析將嚴格基於操作數的編譯時類型來解析。因爲這些都是編譯時類型的操作數的

==(object, object) 

在你的情況下,重載解析解析爲以下運算符重載。對象的==只是執行引用相等性檢查,也就是說,如果兩個對象都是相同的對象,他們顯然不是。

同樣的情況,在下面的代碼:

object o1 = 1; 
object o2 = 1; 
var equal = o1 == o2; //false 

在這種情況下使用Equals是做正確的事,因爲它是一個虛擬呼叫,因此將解析到運行時類型被叫用戶的和給你正確的結果。

那麼爲什麼當你在兩個操作數上調用ToString()時這個工作?僅僅因爲超載分辨率解決了執行值相等的string類中實施的==(string, string)超載。通過Machine Learning

UPDATE

閱讀評論似乎有關於爲什麼==在OP的代碼返回false原因的誤解。我想澄清一下,拳擊與它無關;請看下面的例子:

var str1 = "a"; 
var str2 = 'a'.ToString(); //to avoid string interning by the compiler. 
var equals = str1 == str2; //true 
object o1 = str1; 
object o2 = str2; 
equals = o1 == o2; //false 

的觀察到的行爲是完全一樣的,並沒有裝箱/拆箱這裏發生的一切。

+0

那麼爲什麼'dgvRow.Cells [0] .Value.GetType()。Name'和'transactionLogId.GetType()。Name'返回'Int64'? – The1nk

+0

@ The1nk因爲'GetType'返回對象的運行時類型,也就是對象本身的實際類型,而不是你恰好指向它的引用類型。 – InBetween

+0

Downvoter護理解釋爲什麼? – InBetween

1

它們都是盒裝值,所以==運算符永遠不會是真的。

無論如何,GetType都會返回相應的unboxed實例的類型。

您需要使用Equals。

+0

你也可以檢查這個簡單的[反在線證明](http://rextester.com/MXUR57889):看看發生了什麼類型和比較盒裝詮釋 – 2016-09-13 20:19:42

+0

拳擊是相關的。事實上,在沒有拳擊的情況下觀看[this](http://rextester.com/JIQUE1997)。我們正在談論價值類型(int) – 2016-09-13 20:26:37

+0

不知道爲什麼我以前的評論消失了...無論如何,拳擊是*不*相關:'對象o =「你好」;對象i =新字符串(new [] {'h','e','l','l','o'}); bool equal = o == i; bool e = o.Equals(i);'=='會失敗,這裏根本沒有拳擊。 – InBetween