16

我必须使用 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是整数类型......那我为什么需要演员?

4

9 回答 9

16

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

于 2009-05-29T18:19:28.930 回答
11

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

byte - byte = (0..255) - (0..255) = -255..255
于 2009-05-29T18:20:43.497 回答
8

默认情况下,对字节进行算术运算会产生一个 int 值。

于 2009-05-29T18:18:49.617 回答
4

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

于 2009-05-29T18:19:19.133 回答
2

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

于 2009-05-29T18:18:34.627 回答
2

因为对 sbyte、byte、ushort 和 short 的算术运算会自动转换为 int。最合理的原因是这样的操作很可能上溢或下溢。

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

于 2009-05-29T18:24:27.763 回答
1

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

于 2009-05-29T18:24:05.567 回答
1

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

我认为这是对的:

Eric Lippert 说:“我不认为字节是“数字”;我认为它们是可以解释为数字、字符、颜色或其他内容的位模式。如果你要在它们并将它们视为数字,然后将结果移动到更通常被解释为数字的数据类型中是有意义的。”

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

于 2009-07-04T00:39:20.807 回答
0

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

于 2009-06-02T20:19:15.707 回答