为什么 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
是整数类型...那么为什么我需要进行强制转换?
I have to following code in VS2008 .net 3.5 using WinForms:
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);
When I leave the "(byte)
" off the last line of code, I get a compiler error saying it "Cannot implicitly convert type 'int
' to 'byte
'." If everything is of type byte
and byte
is an integer type... then why do I need to have the cast?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
因为减法将强制为整数。 我记得,byte 是 C# 中的无符号类型,因此减法可以将您带出字节域。
Because subtraction is coercing up to an integer. As I recall, byte is an unsigned type in C#, so subtraction can take you out of the domain of bytes.
这是因为字节减法的结果不适合一个字节:
That's because the result of a byte subtraction doesn't fit in a byte:
字节算术 默认情况下会生成 int 值。
Arithmetic on bytes results in an int value by default.
由于字节算术默认返回整数,因此在两种可能的分配中,较窄的零类型(字节)将提升为 int(oColor.r 的类型 - 百分比)。 因此操作的类型是 int。 如果没有强制转换,编译器将不允许您将较宽的类型分配给较窄的类型,因为这是一个有损操作。 因此,除非您明确表示“我知道我正在丢失一些数据,但没关系”,否则您会收到错误。
Because arithmetic on bytes returns integers by default so of the two possible assignments the narrower type of zero (byte) is promoted to int (that of oColor.r - percent). Thus the type of the operation is an int. The compiler will not, without a cast, allow you to assign a wider type to a narrower type, because it's a lossy operation. Hence you get the error, unless you explicitly say "I know I'm losing some data, it's fine" with the cast.
这是因为
byte
减法返回一个int
。 实际上,任何对字节的二进制算术运算都会返回 int,因此需要进行强制转换。This is because
byte
subtraction returns anint
. Actually any binary arithmetic operations onbytes
will return anint
, so the cast is required.因为sbyte、byte、ushort、short的算术运算会自动转换为int。 最合理的原因是此类操作可能会溢出或下溢。
因此,在三元运算中,最终的 oColor.R - 百分比实际上会产生一个 int,而不是一个字节。 所以该操作的返回类型是int。
Because arithmetic operations on sbyte, byte, ushort, and short are automatically converted to int. The most plausible reason for this is that such operations are likely to overflow or underflow.
Thus, in your ternary operation, the final oColor.R - percent, actually results in an int, not a byte. So the return type of the operation is int.
因为赋值运算符右侧的算术表达式默认计算结果为 int。 在您的示例中,
percent
默认为int
。 您可以在 MSDN 页面上了解更多相关信息。Because the arithmetic expression on the right-hand side of the assignment operator evaluates to int by default. In your example
percent
defaults toint
. You can read more about it on the MSDN page.FWIW,java还将bytes提升为int。
FWIW, java also promotes bytes to int.