Object数组中Int32转Char报错:无法强制转换类型的问题排查
Object数组中Int32转Char引发InvalidCastException的原因与解决方法
问题本质
当int被装箱到object类型后,CLR只允许将这个object拆箱回原始的装箱类型(也就是int),不能直接强制转换成其他值类型(比如char)。
你直接写(char)97没问题,是因为这是值类型之间的显式转换;但(char)x里的x是装箱后的int,CLR会尝试把object直接拆箱为char,而这个object实际存储的是int类型实例,所以会抛出InvalidCastException。
测试方法差异解释
inttest()的参数是int[],x是值类型int,直接转char是值类型之间的合法转换,因此正常运行。objtest()的参数是object[],x是装箱后的int,直接用(char)x属于错误的拆箱操作,必然报错。
修正后的IsVow方法
方法1:先拆箱为int,再转char
public static object[] IsVow(object[] a) { return a.Select(x => { int intVal = (int)x; char testChar = (char)intVal; return "aeiou".Contains(testChar) ? (object)testChar : x; }).ToArray(); }
方法2:使用Convert类自动处理装箱转换
public static object[] IsVow(object[] a) { return a.Select(x => { char testChar = Convert.ToChar(x); return "aeiou".Contains(testChar) ? (object)testChar : x; }).ToArray(); }
两种方法都能解决问题:第一种严格遵循拆箱规则,先还原为原始int类型再转换;第二种利用Convert.ToChar的内部逻辑,自动处理装箱对象的类型转换。
内容的提问来源于stack exchange,提问作者maromalo
相关产品推荐
相关产品推荐

