我的老师要我用C#编写一个程序来处理“数组类型不匹配异常”。但我在网上找不到与之相关的任何内容。我只是想确认是否存在类似的东西。
答案 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)
是的,这是一个例外类:
答案 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.
}
}