【问题标题】:VB.NET OverflowException on very small operationVB.NET OverflowException 非常小的操作
【发布时间】:2018-05-28 14:08:38
【问题描述】:

我正在尝试合并 2 种颜色,为此我创建了一个非常简单的函数:

Public Function MixColors(color1 As Color, color2 As Color) As Color
    Dim a, r, g, b As Byte
    a = (color1.A + color2.A) \ 2
    r = (color1.R + color2.R) \ 2
    g = (color1.G + color2.G) \ 2
    b = (color1.B + color2.B) \ 2

    Return Color.FromArgb(a, r, g, b)
End Function

问题是我在第一次操作时得到了一个溢出异常,我不明白为什么。

我尝试先将变量的类型更改为 Integer,然后再更改为 Double,结果没有任何变化。

我也尝试从 \ 运算符切换到 / ,但仍然没有变化。

变量的类型(color.A)会影响执行吗?

【问题讨论】:

  • VB.NET 对于 .NET 语言来说有点不寻常,添加 2 个字节会产生 Byte 结果,而不是 Integer。所以溢出的不是赋值,而是加法。使用 CInt() 强制进行整数加法,例如 a = CByte((CInt(color1.A) + color2.A) \ 2)。 CByte 是保持 Option Strict On 快乐所必需的。
  • 是的,谢谢,我尝试使用 Int 变量而不是第一种颜色来更改函数并且它起作用了,所以我怀疑它就像你解释的那样。感谢您的澄清:)

标签: vb.net overflowexception


【解决方案1】:

正如 Hans 已经评论过的,如果你添加两个字节(如 color1.A+color1.B),你会得到一个最大值为 255 的字节。你必须将它转换为 Int32,例如 CInt . Color.FromArgb 无论如何都需要 4 个整数。所以以下应该工作:

Dim a, r, g, b As Int32

a = (CInt(color1.A) + CInt(color2.A)) \ 2
r = (CInt(color1.R) + CInt(color2.R)) \ 2
g = (CInt(color1.G) + CInt(color2.G)) \ 2
b = (CInt(color1.B) + CInt(color2.B)) \ 2

Return Color.FromArgb(a, r, g, b)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2018-04-16
    • 2017-08-28
    • 1970-01-01
    相关资源
    最近更新 更多