close

最近遇到一個有趣的怪問題,同樣的程式碼,在VS2002或3及VS2005或8有不同的執行結果,因為VS2002及VS2003的結果一樣,VS2005與VS2008的一樣,所以後續就以.Net 1.X及.Net2.X以上來分別.




首先,不知道大家在看到這一行Code的時候,心中所想到的答案是什麼.


Convert.ToInt16(0).Equals(0)


答案應該是True or False?




執行結果很有趣,在.Net 1.x的執行結果是False.


然而,在.Net 2.X的執行結果卻是True!!!




為什麼同樣的Code會有不同的結果?


瞭解了一下Object.Equals,其實它所比較的不只是值,還比較型別上是否相同.




Int16的型別就是所謂的short,而我放在Equals裡的0則是Int32,所以.Net 1.x的平台在Convert.ToInt16(0).Equals(0)的情況執行下,雖然值是相同,但因為型別不同,所以就視為不同,這段改為Convert.ToInt32(0).Equals(0),就會得到True.


那為什麼.Net 2.X以上卻會得到不同的結果?




這時要看一下不同的.Net平台,在同樣傳入Equals()裡的值被視為什麼.


.Net 1.X


Int16.Equals(object obj)


ValueType.Equals(object obj)


Object.Equals(object obj)


.Net 2.X


Short.Equals(object obj)


Short.Equals(short obj)




從這裡就可以發現到不同啦,在.net 1.X的平台下,裡面的值都是視為object,所以還會比較object的型別,而.Net 2.X的平台下,因為傳入的值不僅有object,還有short這個型別,所以此時在Equals裡的0就"自然"的視為short的囉.


所以在.Net 2.X在平台下,宣告個變數Int32.


Int32 i=0;


Convert.ToInt16(0).Equals(i);


在這邊被傳入的 i 是視為object,會用其原本的型別來判斷.因為變數的型別不同,這時就會得到False囉,



arrow
arrow
    全站熱搜
    創作者介紹
    創作者 jeffyeh 的頭像
    jeffyeh

    jeffyeh

    jeffyeh 發表在 痞客邦 留言(0) 人氣()