这个表达有什么问题? 无法将类型’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。