C# 什么';这个表达有什么不对?无法隐式转换类型';int';至';字节';

C# 什么';这个表达有什么不对?无法隐式转换类型';int';至';字节';,c#,C#,我收到错误“无法将类型“int”隐式转换为“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 {

我收到错误“无法将类型“int”隐式转换为“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),这就是为什么此操作返回一个。您可以自行承担将结果强制转换回的风险。

C#在对所有操作数进行算术运算之前,将所有操作数加宽到
int
。所以您需要显式地将其转换回字节


添加两个字节将生成一个C#的整数。将整个内容转换回一个字节

rgb.Red = (byte)(Convert.ToByte(Math.Round((h - 4) * delta)) + rgb.Green);
有关更多信息,请参阅。

字节+字节=int

更准确地说,框架并没有在字节上定义运算符+,但有一个从字节到int的隐式转换

字节+字节=整数+整数=整数

我不太同意这样做的理由,即它可能会溢出,因为int+int也可能溢出。但很明显,字节算术在这方面要“危险”得多——这种行为迫使你仔细看看自己在做什么

对于内置数字类型,当要存储的值能够在不被截断或舍入的情况下适合变量时,可以进行隐式转换。例如,long(8字节整数)类型的变量可以存储int(32位计算机上的4字节)可以存储的任何值

请参阅本节中的隐式转换部分

现在来看你的例子,显然字节+字节不一定是字节。所以字节+字节可能是int。在这种情况下,“隐式转换”将不适用,因为向上转换是可能的,反之亦然,即int可以转换为long,字节可以转换为int。

因此,在您的情况下,您需要显式转换。编译器需要您执行此操作

但是,如果无法进行转换而不存在信息丢失的风险,编译器要求您执行一个显式转换,称为转换。转换是一种显式通知编译器您打算进行转换,并且您知道可能会发生数据丢失的方法

请参阅同一页中的显式转换

以你为例

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

这将显式地将int转换为byte

什么是rgb,我认为它是颜色等级的对象,即为什么它不工作…@Javed Akram,
rgb
是一个
struct
,如更新中所示,好的,专家给出的答案是正确的。+1:有趣的,我不知道这个。。。当然,我想不出我用C#写的任何两个字节相加的代码。这不是一个好理由,即使是Int64+Int64也可能溢出。一定应用了一些实用主义。+1@HenkHolterman我同意,这完全是因为字节上没有运算符+显然是因为性能原因(32位或64位处理器上的8位算法效率不高)。因此,隐式转换为int。实际上与“保护我们”免受溢出风险无关。有关更多解释,请参阅