为什么char在这个反编译中被转换成ushort而不是int?
当我写一个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());
}
是否有人可以解释为什么编译器没有更改数据类型我从非数字到数字?
- 编辑 - 添加反编译器截图
要回答这个问题的标题,
为什么焦炭被转换成一个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。
一个字符可以隐式转换为USHORT,INT,UINT,长,ULONG,为float,double或十进制
是的,但它与问题有什么关系? – BoltClock 2011-05-23 18:19:03
如何解释为什么你认为它会。 – 2011-05-23 18:11:29
,因为如果你写char i = 65;我 Asdfg 2011-05-23 18:13:25
一切都只是在引擎盖下。谁知道编译和反编译之间发生了多少转换。 – Hogan 2011-05-23 18:14:11