我收到错误“无法将类型'int'隐式转换为'byte'。存在显式转换(您是否错过了转换?)”。 byte + byte = byte
不是吗?我还注意到,当我删除+rgb.Green
时,它会起作用
// rgb.Red, rgb.Green, rgb.Blue are byte types
// h, delta are double
rgb.Red = Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green;
public struct RGBColor
{
public byte Red { get; set; }
public byte Green { get; set; }
public byte Blue { get; set; }
}
答案 0 :(得分:16)
添加两个字节会在C#中生成一个整数。将整个事物转换回一个字节。
rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);
有关详细信息,请参阅byte + byte = int... why?。
答案 1 :(得分:13)
答案 2 :(得分:6)
http://msdn.microsoft.com/en-us/library/5bdb6693(VS.71).aspx
byte + byte = int
更准确地说框架没有在字节上定义operator +,但是有一个从byte到int的隐式转换,到
byte + byte = int + int = int
我不完全同意这可能会溢出的理由,因为int + int也是如此。但显然字节算法在这方面更加“危险” - 这种行为迫使你仔细研究你正在做的事情。
答案 3 :(得分:1)
在对它们进行算术运算之前,C#将所有操作数扩展为int
。因此,您需要明确地将其强制转换为字节。
http://msdn.microsoft.com/en-us/library/5bdb6693(VS.80).aspx
答案 4 :(得分:0)
对于内置数值类型,当要存储的值适合而不被截断或舍入时,可以进行隐式转换。例如,long(8字节整数)类型的变量可以存储int(32位计算机上的4个字节)可以存储的任何值。
请参阅此https://msdn.microsoft.com/en-us/library/ms173105.aspx
中的隐式转化部分现在来看你的例子显然字节+字节不一定是一个字节。所以byte + byte可以是int。在那种情况下"隐式转换"不适合因为向上转换可能反之亦然,即int可以转换为long,byte可以转换为int。
因此,在您的情况下,您需要显式转换。编译器需要您执行此操作。
但是,如果无法在没有丢失信息风险的情况下进行转换,则编译器要求您执行显式转换,称为转换。转换是一种显式通知您打算进行转换的编译器,并且您知道可能会发生数据丢失。
在同一页面中提及显式转化。
所以你的例子
rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);
这将显式地将int转换为byte。