不明显的类型转换:x=(x+xstep<;xmax?x+xsstep:xmax)
本文关键字:xmax lt x+xsstep x+xstep 类型转换 不明显 | 更新日期: 2023-09-27 18:25:48
给定以下代码:
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的转换发生在哪里?为什么?
将其分解。我们有
sum = expression
总和的类型为字节。表达式的类型是什么?把它分解。表达式为
summand1 + summand2
总和1的类型为字节。sumand2是什么类型的?把它分解。它是:
test ? consequence : alternative
测试类型为bool。备选方案的类型为字节。后果是什么类型的?把它分解!它是:
summand3 + summand4
这是字节+字节。Byte+Byte是int,所以结果是int类型。
现在我们有足够的信息来计算sumand2的类型。结果是int,替代是byte,int是这两种类型中更通用的一种。(因为每个字节都可以转换为int,但不是每个int都可以转换成字节。)
所以sumand2的类型是int。所以sum等于一个字节加一个int。byte加int就是int,所以我们把int赋值给byte。这是一个显式转换,而不是隐式转换。
根据MSDN:,将byte
添加到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);
这样行吗?
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
,所以我想这才是真正的答案。
但是,我的版本编译时没有任何抱怨,只有一个演员阵容。