在C#中是否存在所谓的数组类型不匹配异常?

在C#中是否存在所谓的数组类型不匹配异常?,c#,arrays,exception-handling,C#,Arrays,Exception Handling,我的老师让我用C语言编写一个程序来处理“数组类型不匹配异常”。但我在网上找不到任何与此相关的东西。我只是想确认是否存在类似的情况。是的,它是一个异常类: 在MSDN上在MSDN上引用: 当系统无法将元素转换为为为数组声明的类型时,将引发ArrayTypeMismatchException。例如,字符串类型的元素不能存储在Int32数组中,因为不支持这些类型之间的转换。应用程序通常不需要抛出此异常 以上面的链接为例。假设Class2源于Class1,因为C语言在分配数组时是协变的,分配后的数组是完

我的老师让我用C语言编写一个程序来处理“数组类型不匹配异常”。但我在网上找不到任何与此相关的东西。我只是想确认是否存在类似的情况。

是的,它是一个异常类:

在MSDN上

在MSDN上引用:

当系统无法将元素转换为为为数组声明的类型时,将引发ArrayTypeMismatchException。例如,字符串类型的元素不能存储在Int32数组中,因为不支持这些类型之间的转换。应用程序通常不需要抛出此异常


以上面的链接为例。

假设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没有包含更多的数组变量类型家族,包括不可变、可读、可读和可置换(所有这些类型都可以安全地协变,后者允许在数组中交换元素,但不允许在数组中存储新元素)。我不认为我见过后一种类型的集合接口,但这样的设计允许以静态类型安全的方式进行排序。