我必须使用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
是整数类型...那么为什么我需要进行投射?
答案 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。