这个表达有什么问题?无法将类型'int'隐式转换为'byte'

时间:2010-11-08 12:25:47

标签: c#

我收到错误“无法将类型'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; }
}

5 个答案:

答案 0 :(得分:16)

添加两个字节会在C#中生成一个整数。将整个事物转换回一个字节。

rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);

有关详细信息,请参阅byte + byte = int... why?

答案 1 :(得分:13)

  

不是字节+字节=字节吗?

不,因为它可能会溢出(> 255),这就是为什么此操作返回Int32的原因。您可以将结果转回byte,风险自负。

答案 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。