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

Jie*_*eng 10 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; }
}
Run Code Online (Sandbox Code Playgroud)

Pie*_*kel 16

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

rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);
Run Code Online (Sandbox Code Playgroud)

请参见byte + byte = int ...为什么?欲获得更多信息.


Dar*_*rov 13

不是字节+字节=字节?

不,因为它可能溢出(> 255),这就是为什么这个操作返回一个Int32.您可以将结果转换回字节,风险自负.

  • 这不是一个很好的理由,即使Int64 + Int64也会溢出。必须应用一些实用主义。 (2认同)
  • +1 @HenkHolterman我同意,这完全是由于性能原因(32位或64位处理器上的8位算术效率不高),显然字节上没有运算符+。因此隐式转换为int。实际上与“保护我们”免受溢出风险无关。 (2认同)

Jam*_*unt 6

http://msdn.microsoft.com/en-us/library/5bdb6693(VS.71).aspx

byte + byte = int

更准确的说,框架没有定义operator + on byte,但是有一个从byte到int的隐式转换

byte + byte = int + int = int

我不太同意这种情况可能会溢出,因为int + int也是如此.但显然字节算法在这方面更加"危险" - 这种行为迫使你仔细研究你在做什么.