你知道Convert.ToInt16(0).Equals(0)的答案嗎

同樣的Convert.ToInt16(0).Equals(0),在.Net 1.X及.Net 2.X以上執行,卻有不同的結果.

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