最近遇到一個有趣的怪問題,同樣的程式碼,在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囉,
留言列表