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

时间:2009-05-29 18:15:08

标签: c# .net casting integer byte

我必须使用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'转换为'{ {1}}”。”如果所有内容都是byte类型且byte是整数类型...那么为什么我需要进行投射?

9 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:11)

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

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

答案 2 :(得分:9)

Arithmetic on bytes默认会产生一个int值。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

因为赋值运算符右侧的算术表达式默认值为int。在您的示例中,percent默认为int。您可以在MSDN page上了解更多相关信息。

答案 7 :(得分:1)

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

我认为这是对的:

  
    

Eric Lippert说,“我不认为字节是”数字“;我认为它们是可以被解释为数字,字符,颜色或其他任何东西的位模式。如果你将成为对它们进行数学运算并将它们视为数字,然后将结果移动到更常被解释为数字的数据类型中是有意义的。“

  

也许字节更接近char而不是int。

答案 8 :(得分:0)

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