为什么对于FromArgb,Windows窗体设计器先将int强制转换为byte,然后再将其转换回int

本文关键字:int 转换 然后 byte FromArgb Windows 窗体 为什么 | 更新日期: 2023-09-27 18:21:52

我今天浏览了一些代码,看到了如下内容:

var colour = Color.FromArgb(((int)(((byte)(227)))), ((int)(((byte)(213)))), ((int)(((byte)(193)))));

当我问为什么会这样时,由于Resharper确认所有的造型都是多余的,我被告知设计师是这样做的,他们已经复制了。

我看了一下,确信设计器在将属性设置为自定义颜色时会生成与上面相同的代码。

有人知道设计者为什么要这么做吗?从表面上看,这似乎没有意义,除非我错过了什么?

为什么对于FromArgb,Windows窗体设计器先将int强制转换为byte,然后再将其转换回int

此代码由Winforms设计器中内置的代码序列化程序自动生成。这里的有罪方是System.Drawing.ColorConverter类,即Color的TypeConverter。其ConvertTo()方法中的相关代码为:

   member = typeof(Color).GetMethod("FromArgb", new Type[] { typeof(int), typeof(int), typeof(int) });
   arguments = new object[] { color2.R, color2.G, color2.B };

R、G和B属性返回一个字节。因此,代码序列化程序首先生成整数文本,并应用(字节)转换来匹配参数类型。然后看到FromArgb()接受整数参数,因此应用(int)强制转换。

这只是疯狂的机器生成代码。它只需要是正确的,不必是漂亮的。

没有任何好处。它所做的只是让代码变得难以阅读。

这是优选的

var colour = Color.FromArgb(227, 213, 193);

甚至阿尔法通道版本:

var colour = Color.FromArgb(255, 227, 213, 193);

正如@Alexei Levenkov所指出的,也许作者是谨慎的,但考虑到该方法的明确名称及其(众所周知的)预期用途,为什么有人会对任何参数使用大于255的值?

参考。颜色。从Argb方法