我有一个应用程序,它从隔离存储设置中提取背景颜色的ARGB值;我在int数据类型中给出了值。但是color.fromargb()需要字节数据类型,但是当我投射它时,它会给出异常"无效的强制转换"
这是异常代码:
backcolor.Color = Color.FromArgb((byte)dailyspring_settings["back_color_a"],(byte)dailyspring_settings["back_color_r"], (byte)dailyspring_settings["back_color_g"], (byte)dailyspring_settings["back_color_b"]);
隔离的存储代码
dailyspring_settings.Add("back_color_a",100 );
dailyspring_settings.Add("back_color_r",103 );
dailyspring_settings.Add("back_color_g",158 );
dailyspring_settings.Add("back_color_b",236);
答案 0 :(得分:2)
正如Ulugbek Umirov指出的那样,解决方案是"双重演员"。
假设s
表示表达式dailyspring_settings["back_color_b"]
,表达式的类型为object
,其评估的对象为int
(系统.Int32)。
因此首先从object->int
开始使用以下Type Cast。类型转换会更改表达式的类型或"视图"对象,但它不更改或创建新对象 - 因此如果s
未评估为int
,它将失败并出现InvalidCastException(System.Int32 )价值。
int i = (int)s;
现在,如果表达式为int
,则下一步是int->byte
。这是通过在表达式和字节之间定义的类型转换来完成的。结果是新值,即字节。
byte b = (byte)i;
所以,正如所建议的那样,把它们放在一起:
(byte)(int)dailyspring_settings["back_color_a"]
以上用法" Type Cast"和"类型转换"是为了说明一点;有关技术细节和术语,请参阅以下问题。