VB.NET OverflowException对非常小的操作

VB.NET OverflowException对非常小的操作,vb.net,overflowexception,Vb.net,Overflowexception,我正在尝试合并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 + col

我正在尝试合并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
问题是我在第一次操作时就得到了OverflowException,我不明白为什么

我尝试先将变量的类型更改为整数,然后再更改为双精度,结果不变

我还尝试从\运算符切换到/one,但仍然没有更改


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

正如Hans已经评论的那样,如果添加两个字节(如
color1.A+color1.B
),则会得到一个最大值为255的字节。您必须将其强制转换为
Int32
,例如使用
CInt
。无论如何都需要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)

对于.NET语言来说,VB.NET有点不寻常,添加2个字节会生成一个字节结果,而不是整数。因此,溢出的不是分配,而是添加。使用CInt()强制整数加法,如a=CByte((CInt(color1.a)+color2.a)\2)。CByte是保持happy选项严格的必要条件。是的,谢谢,我尝试用Int变量而不是第一个颜色来更改函数,结果成功了,所以我怀疑正如您所解释的那样。感谢您的澄清:)