Есть ли что-то известное как исключение несоответствия типов массива в C #? - PullRequest
2 голосов
/ 13 августа 2010

Мой учитель попросил меня написать программу на C # для обработки "Исключение несоответствия типов массивов".Но я не смог найти в сети ничего связанного с этим.Я просто хочу подтвердить, существует ли что-то подобное.

Ответы [ 5 ]

5 голосов
/ 13 августа 2010
3 голосов
/ 31 августа 2012

Скажем, 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

1 голос
/ 13 августа 2010

Как указано в ArrayTypeMismatchException Class в MSDN:

ArrayTypeMismatchException вызывается, когда система не может преобразовать элемент в тип, объявленный для массива.Например, элемент типа String не может быть сохранен в массиве Int32, поскольку преобразование между этими типами не поддерживается.Как правило, приложениям не нужно выдавать это исключение.

Используйте ссылку выше, например.

0 голосов
/ 05 февраля 2016

Это может произойти при оценке времени выполнения списков аргументов.В разделе 7.5.1.2 C # 5.0 упоминается:

• Для параметра ссылки или выходного параметра оценивается ссылка на переменную, и результирующее место хранения становится местом хранения, представленным параметром в вызове функции-члена.Если ссылка на переменную, заданная как ссылка или output параметр, является элементом массива ссылочного типа, выполняется проверка во время выполнения, чтобы убедиться, что тип элемента массив идентичен типу параметра.Если эта проверка не пройдена, выдается 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.
    }
}
0 голосов
/ 13 августа 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...