2011-05-23 78 views
0

當我寫一個for循環如下,它工作正常。爲什麼char在這個反編譯中被轉換成ushort而不是int?

for (Char ch = 'A'; ch < 'Z'; ch++) 
{ 
    Console.WriteLine(ch.ToString()); 
} 

我認爲編譯器轉換char類型爲int,但是當我看着反編譯的代碼,這是我所看到的:

for (char i = 65; i < 97; i = (ushort)i + 1) 
{ 
    Console.WriteLine(i.ToString()); 
} 

是否有人可以解釋爲什麼編譯器沒有更改數據類型我從非數字到數字?

- 編輯 - 添加反編譯器截圖 enter image description here

+4

如何解釋爲什麼你認爲它會。 – 2011-05-23 18:11:29

+0

,因爲如果你寫char i = 65;我<97;我=(ushort)i + 1在IDE中,它不會工作。 – Asdfg 2011-05-23 18:13:25

+0

一切都只是在引擎蓋下。誰知道編譯和反編譯之間發生了多少轉換。 – Hogan 2011-05-23 18:14:11

回答

9

要回答這個問題的標題,

爲什麼焦炭被轉換成一個USHORT,而不是在這個反編譯一個int?

字符是16位,所以是無符號短褲。根本沒有必要轉換成任何更大範圍的類型。您使用的反編譯器可能正在基於此工作。

要回答你的問題,編輯,

是否有人可以解釋爲什麼編譯器沒有我的數據類型由非數字更改爲數字?

這恰恰是因爲字符,而他們相應的數字字符代碼,本身並不是一樣的數字類型。你可以把一個整數轉換成一個char,但它們不是一回事。因此,((char) 65).ToString()((int) 65).ToString()不一樣。


爲了記錄在案,.net反射7反編譯代碼,以這樣的:

for (char ch = 'A'; ch < 'Z'; ch = (char) (ch + '\x0001')) 
{ 
    Console.WriteLine(ch.ToString()); 
} 

沒有任何整數的跡象隨時隨地根據反射器。代碼與您最初編寫的代碼幾乎完全相同。

如果你想看看真正發生的事情,看看IL。

+0

Char不是數字類型。編譯器如何將65分配給char數據類型?如果我試圖說char c = 65 ;,它會拋出錯誤bcz 65不能被分配給Char。 – Asdfg 2011-05-23 18:15:20

+0

你用什麼來反編譯?反射? – BoltClock 2011-05-23 18:16:33

+0

是的。我不在乎它是否轉換爲Int或long或double。編譯器如何將數值分配給非數字類型是我的問題所在。 – Asdfg 2011-05-23 18:17:30

0

一個字符可以隱式轉換爲USHORT,INT,UINT,長,ULONG,爲float,double或十進制

+0

是的,但它與問題有什麼關係? – BoltClock 2011-05-23 18:19:03

相關問題