在C#中是否存在所谓的数组类型不匹配异常?
我的老师让我用C语言编写一个程序来处理“数组类型不匹配异常”。但我在网上找不到任何与此相关的东西。我只是想确认是否存在类似的情况。是的,它是一个异常类: 在MSDN上在MSDN上引用: 当系统无法将元素转换为为为数组声明的类型时,将引发ArrayTypeMismatchException。例如,字符串类型的元素不能存储在Int32数组中,因为不支持这些类型之间的转换。应用程序通常不需要抛出此异常在C#中是否存在所谓的数组类型不匹配异常?,c#,arrays,exception-handling,C#,Arrays,Exception Handling,我的老师让我用C语言编写一个程序来处理“数组类型不匹配异常”。但我在网上找不到任何与此相关的东西。我只是想确认是否存在类似的情况。是的,它是一个异常类: 在MSDN上在MSDN上引用: 当系统无法将元素转换为为为数组声明的类型时,将引发ArrayTypeMismatchException。例如,字符串类型的元素不能存储在Int32数组中,因为不支持这些类型之间的转换。应用程序通常不需要抛出此异常 以上面的链接为例。假设Class2源于Class1,因为C语言在分配数组时是协变的,分配后的数组是完
以上面的链接为例。假设Class2源于Class1,因为C语言在分配数组时是协变的,分配后的数组是完全有效的
Class1[] generalizedArray;
Class2[] specializedArray = new Class2[]{new Class2(),new Class2()};
generalizedArray= specializedArray;
但是,如果您指定这样一个元素,则在中途
generalizedArray[0]=new Class1()
编译器甚至不会发出警告。您将在运行时得到一个讨厌的ArrayTypeMismatchException。这是因为你不能
类似上面的数组中有两种类型的对象
阅读更多关于C#语言中协方差、逆变和不变性的信息
它可能发生在参数列表的运行时计算中。
第7.5.1.2 C#5.0节提到:
•对于引用或输出参数,对变量引用进行评估,结果存储位置成为函数成员调用中参数表示的存储位置。如果作为引用或输出参数给定的变量引用是引用类型的数组元素,则执行运行时检查以确保数组的元素类型与参数的类型相同。如果此检查失败,将抛出一个System.ArrayTypeMismatchException
规范中给出了一个简单的例子:
class Test
{
static void F(ref object x) {...}
static void Main() {
object[] a = new object[10];
object[] b = new string[10]; //Array covariance
F(ref a[0]); // Ok
F(ref b[1]); // ArrayTypeMismatchException because the actual element type of b is string and not object.
}
}
太糟糕了,.net没有包含更多的数组变量类型家族,包括不可变、可读、可读和可置换(所有这些类型都可以安全地协变,后者允许在数组中交换元素,但不允许在数组中存储新元素)。我不认为我见过后一种类型的集合接口,但这样的设计允许以静态类型安全的方式进行排序。