为何char[]调用Cast<int>会抛出强制转换异常?附解决方案
为什么
Cast<int>()在字符串上会触发无效强制转换异常? 这问题我之前也踩过坑,咱们来一步步捋清楚原因:
为什么前两种写法会报错?
先搞明白Cast<T>()的本质:它是为非泛型集合设计的工具方法,核心作用是把集合里的元素「当作」T类型来处理——注意,它只负责拆箱操作(比如把装箱成object的int拆回int),或者处理引用类型的向上/向下转型,完全不支持不同值类型之间的显式转换。
- 第一种写法
text.Cast<int>().ToArray():字符串text实现了IEnumerable<char>,Cast<int>()会尝试把每个char实例直接「当作」int来拆箱,但char本身是值类型,并没有被装箱成object,而且char和int是完全不同的值类型,这种跨类型的强制转换是Cast<T>处理不了的,所以直接抛出InvalidCastException。 - 第二种写法
text.ToCharArray().Cast<int>().ToArray():哪怕转成了char[],它依然是IEnumerable<char>,Cast<int>()的逻辑和上面完全一致,还是试图把char直接转成int,自然也会触发同样的异常。
最简可行方案
你最后用的Select(c=>(int)c).ToArray()就是最优解!因为Select里的lambda表达式是显式执行C#原生支持的值类型转换——char可以通过显式转换直接得到对应的ASCII/Unicode码值(也就是int类型),所以这段代码能正常运行。
如果要写得更紧凑一点,也可以保持你现在的写法:
var c3 = text.Select(c => (int)c).ToArray();
内容的提问来源于stack exchange,提问作者david.pfx
相关产品推荐
相关产品推荐

