这个问题已经有一个答案在这里:

我有这个代码。

byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (0x80 | dup) });

当我试图汇编的我会得到:

无法隐含的转型'int' 来'字节的'.一个明确的转换 存在(是否缺少一个铸的?)

为什么这种事发生?不|两字节得到一个字?以下两种工作,确保每一个项目是字节。

Encoding.ASCII.GetString(new byte[] { (dup) });
Encoding.ASCII.GetString(new byte[] { (0x80) });
有帮助吗?

解决方案

就是这样通过设计,而且,事实上,可以追溯到C/C++-后者还促进操作数 int, 你只是通常没有注意到因为 int -> char 转换还是隐含的,虽然它不是。这并不仅仅适用于 | 但是所有的算术和位的操作数-例如添加两个 byte会给你一个 int 为好。我要引用的相关部分的规格:

二进制数字,促进发生 操作数的预定+,–, *, /, %, &, |, ^, ==, !=, >, <,>=, <=二进制的运营商。二进制 数字隐含地促进转换 两个操作数到一个共同的类型, 在情况下的非关系 经营者,也成为结果 类型的操作。二进制数字 促进由施加的 以下规则,在为了他们 出现在这里:

  • 如果操作数的 十进制类型,其他操作数的 转型的小数,或 编制时发生错误,如果其他 操作数的类型浮动或一倍。

  • 否则,如果操作数的 类型的双重,其他操作数的 转型倍。

  • 否则, 如果操作数的类型浮动, 另一个操作数被转换成类型 浮动。

  • 否则,如果操作数的 是的类无符长,其他操作数的 转化成类无符长,或 编制时发生错误,如果其他 操作数类型的符号字节、短,int, 或长。

  • 否则,如果任 操作的类型很长,其他的 操作数转型长。

  • 否则,如果操作数的 uint类型和其他操作数的 类型的符号字节,短,或int,既 操作数转型长。

  • 否则,如果操作数的 uint类型,其他操作数的 转型uint。

  • 否则, 两个操作数被转换成类型 int。

我不知道确切的理由这一点,但是我能想到的一个。为算术运营商,尤其是,它可能是一个有点令人惊讶的人 (byte)200 + (byte)100 突然等于 44, 即使这使某种意义上说,当一个仔细考虑的类型参与。另一方面, int 通常被认为是一类型的"足够好的"用于算术上最典型的号码,以便通过促进这两个论点来 int, 你会得到一种"工作"行为最常见的情况。

为什么这种逻辑也适用于按位运营商-我想这是如此的大部分用于一致性。它的结果在一个单一的简单的规则常见于 所有 非布尔的二进制的类型。

但是,这是所有主要猜测。埃里克利珀特大概会是一个问背后的真正动机这一决定,对C#至少(虽然这可能有点无聊如果答案是简单的"其是它是如何做C/C++、Java,这是一个足够好的规则,因为它是,那么我们认为,没有理由改变它").

其他提示

字面0x80有类型"int",所以你不是"或"字节。

你可以通过它字节[]只因为0x80(作为文本),它是范围内的字节。

编辑:即使0x80一个转换为字节,该守则将仍然不是编纂,因为"或"字节将仍然得到int。它汇编、结果或必须投: (byte)(0x80|dup)

byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (byte)(0x80 | dup) });

结果一位或(|)上两个字节总是一个int.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top