2011-05-23 42 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

相关问题