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
相关产品推荐
相关产品推荐

