给出以下代码:
byte x, xmin, xmax, xstep;
x = (x + xstep < xmax ? x + xstep : xmax)
编译器告诉我
Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)
从byte到int的转换发生在哪里?为什么?
答案 0 :(得分:7)
分解。我们有
sum = expression
Sum的类型为byte。什么是表达方式?分解。表达是
summand1 + summand2
Summand1的类型为byte。 summand2是什么类型的?分解。它是:
test ? consequence : alternative
测试类型为bool。替代是字节类型。什么类型的后果?分解吧!它是:
summand3 + summand4
那是字节+字节。字节+字节是int,因此结果是int类型。
现在我们有足够的信息来计算summand2的类型。结果是int,替代是byte,而int是这两种类型中更常见的。 (因为每个字节都可以转换为int,但不是每个int都可以转换为byte。)
因此summand2的类型是int。所以我们总和等于一个字节加一个int。 Byte plus int是int,因此我们将int分配给byte。哪个是显式转换,而不是隐式转换。
答案 1 :(得分:6)
byte
根据MSDN <{1}}向byte
添加int
:
例如,考虑以下两个字节变量x和y:
byte x = 10, y = 20;
以下赋值语句将产生编译错误,因为赋值运算符右侧的算术表达式默认情况下计算为int。
// Error: conversion from int to byte: byte z = x + y;
要解决此问题,请使用强制转换:
// OK: explicit conversion: byte z = (byte)(x + y);
答案 2 :(得分:0)
这会有用吗?
byte x, xmin, xmax, xstep;
// assign your variables x, xmin, xmax, and xstep,
// then...
x = ((x + xstep) < xmax) ? (byte)(x + xstep) : xmax;
你只需要投射那一部分,可能是因为 超过byte
尺寸,但我不知道。
......或者真的在乎为什么。 :)
根据T.J.在那里,向byte
添加byte
会产生int
,所以我猜这是真正的答案。
但是,我的版本编译时没有投诉,只有一个演员。