这个表达有什么问题? 无法将类型’int’隐式转换为’byte’
我收到错误“无法将类型’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; } }
不是字节+字节=字节?
不,因为它可能溢出(> 255),这就是为什么这个操作返回一个Int32 。 您可以将结果转换回字节 ,风险自负。
添加两个字节会在C#中生成一个整数。 将整个事物转换回一个字节。
rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);
请参见byte + byte = int …为什么? 欲获得更多信息。
http://msdn.microsoft.com/en-us/library/5bdb6693(VS.71).aspx
byte + byte = int
更准确地说框架没有在字节上定义operator +,但是有一个从byte到int的隐式转换
byte + byte = int + int = int
我不太同意这可能会溢出的理由,因为int + int也是如此。 但显然字节算法在这方面更加“危险” – 这种行为迫使你仔细研究你在做什么。
在对它们进行算术运算之前,C#将所有操作数扩展为int
。 所以你需要明确地将它强制转换回字节。
http://msdn.microsoft.com/en-us/library/5bdb6693(VS.80).aspx
对于内置数值类型, 当要存储的值可以适合变量而不被截断或舍入时,可以进行隐式转换。 例如,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。