You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中字符串数组转对象数组后赋值触发ArrayTypeMismatchException的疑问

关于ArrayTypeMismatchException的疑惑

微软C#课程讲解ArrayTypeMismatchException时给出了如下示例代码:

string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;

Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs

课程提到这是“试图将数值存入字符串数组”的案例,但objs已经被转换为Object[]类型数组,为什么存入(Object)13会触发异常?


解答

  • 数组的实际类型从未改变:把string[]类型的names强制转换为Object[]变量,只是让objs这个变量以Object[]的“视角”引用原数组,并没有在内存中创建新的Object[]数组。原数组本质还是string[]类型。
  • 数组协变的局限性:C#允许将派生类型数组转换为基类型数组(即数组协变),但这种协变只保证读取操作安全——因为所有string都是Object,所以通过objs读取元素没问题。但写入操作时,CLR会在运行时检查数组的实际类型,发现要存入的(Object)13是装箱后的int,并非string类型,因此抛出ArrayTypeMismatchException。
  • 总结:变量objs的编译类型是Object[],但数组的运行时实际类型仍是string[],你无法向字符串数组中存入非字符串类型的对象,无论用什么类型的变量去操作它。

内容的提问来源于stack exchange,提问作者Gaussler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:57:03