为什么C#中的字节减法需要强制转换?

我必须使用WinForms在VS2008 .net 3.5中使用以下代码:

byte percent = 70; byte zero = 0; Bitmap copy = (Bitmap)image1.Clone(); ... Color oColor = copy.GetPixel(x, y); byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent); 

当我离开最后一行代码的“ (byte) ”时,我得到一个编译器错误,说它“不能隐式地将类型’ int ‘转换为’ byte ‘。” 如果一切都是byte类型而byte是一个整数类型…那么为什么我需要进行强制转换呢?

因为减法是强制转换为整数。 我记得,字节是C#中的无符号类型,因此减法可以将您带出字节域。

那是因为字节减法的结果不适合一个字节:

 byte - byte = (0..255) - (0..255) = -255..255 

字节算术默认情况下会产生一个int值。

因为字节算术默认返回整数,所以在两个可能的赋值中,较窄的零(字节)类型被提升为int(oColor.r的百分比)。 因此,操作的类型是int。 没有强制转换,编译器不会允许您将更宽的类型分配给更窄的类型,因为它是一个有损操作。 因此,你得到错误,除非你明确说“我知道我正在丢失一些数据,这很好”与演员。

这是因为byte减法返回一个int 。 实际上,对bytes任何二进制算术运算都将返回一个int ,因此需要强制转换。

因为sbyte,byte,ushort和short上的算术运算会自动转换为int。 最合理的原因是此类操作可能会溢出或下溢。

因此,在你的三元运算中,最终的oColor.R – 百分比实际上会产生一个int,而不是一个字节。 所以操作的返回类型是int。

因为赋值运算符右侧的算术表达式默认值为int。 在您的示例中, percent默认为int 。 您可以在MSDN页面上阅读有关它的更多信息。

尝试运行这个C#代码:object o =(byte)(1); o =(int)o; 你能指望什么? 现在试试:)

我认为这是对的:

Eric Lippert说,“我不认为字节是”数字“;我认为它们是位的模式,可以解释为数字,字符,颜色或其他任何东西。如果你要在数学上做将它们视为数字,然后将结果转换为更常被解释为数字的数据类型是有意义的。“

也许byte更接近char而不是int。

FWIW,java也将字节提升为int。