【问题标题】:What's wrong with this expression? Cannot implicitly convert type 'int' to 'byte'这个表达有什么问题?无法将类型“int”隐式转换为“byte”
【发布时间】:2010-11-08 12:25:47
【问题描述】:

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

【问题讨论】:

  • 什么是 rgb,我认为它是 Color 类的对象,即为什么它不起作用....
  • @Javed Akram,rgbstruct,如更新所示
  • 哦,好的,专家给出的答案是合格的。

标签: c#


【解决方案1】:

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

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

更多信息请参见byte + byte = int... why?

【讨论】:

  • +1:有趣,我不知道这个...当然,我想不出我用 C# 编写的任何代码将两个字节加在一起。
【解决方案2】:

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

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

【讨论】:

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

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

字节 + 字节 = 整数

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

字节 + 字节 = int + int = int

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

【讨论】:

    【解决方案4】:

    C# 在对它们进行算术运算之前将所有操作数扩大到int。所以你需要将它显式地转换回字节。

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

    【讨论】:

      【解决方案5】:

      对于内置数字类型,当要存储的值可以适合变量而不被截断或舍入时,可以进行隐式转换。例如,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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 2011-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多