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

时间:2010-08-13 14:15:16

标签: c# arrays exception-handling

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

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

假设Class2派生自Class1,因为C#语言在分配完成后分配数组时是协变的

Class1[] generalizedArray;
Class2[] specializedArray = new Class2[]{new Class2(),new Class2()};

generalizedArray= specializedArray;

但是,如果你指定一个像这样的元素

那么一半
generalizedArray[0]=new Class1()

编译器甚至不会发出警告。您将在运行时获得令人讨厌的 ArrayTypeMismatchException 。这是因为你不能拥有 数组中的两种类型的对象,如上所述

详细了解C#语言中的协方差,逆变和不变性 http://geekswithblogs.net/Martinez/archive/2008/12/30/covariance-contravariance-and-invariance-in-c-language.aspx

答案 2 :(得分:1)

正如MSDN上ArrayTypeMismatchException Class所述:

  

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

例如,使用上面的链接。

答案 3 :(得分:0)

是的,这是一个例外类:

Mismatch match exception

答案 4 :(得分:0)

可以在参数列表的运行时评估中进行。 第7.5.1.2节C#5.0提及:

  

•对于引用或输出参数,将评估变量引用,并且生成的存储位​​置将成为函数成员调用中参数表示的存储位置。如果作为引用输出参数给出的变量引用是引用类型的数组元素,则执行运行时检查以确保元素类型为 array 与参数的类型相同。如果此检查失败,则抛出 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.
    }
}