Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Странности приведения .Net 4.6.1

Чтобы не вдаваться в детали самого кода, приведу более абстрактную ситуацию. Как мы все прекрасно знаем, следующий код вполне себе рабочий:
int a = 1; double b = (double)a;
Рабочим он оставался и в таком случае:
int a = 1; object b = a; double c = (double)b;
(Ибо в объекте содержится int, a int к double приводится без проблем). Но каково же было моё удивление, когда аналогичный по сути кусок кода отказался работать на новом фреймворке. То есть на, грубо говоря, строке
double c = (double)b;
У меня вылетает ошибка, что такое приведение является недопустимым. Такое положение дел меня весьма расстроило и я, с грустным лицом временно запилив в ту строку Convert.ChangeType(), пошёл писать сюда сей вопрос дабы выяснить, что тут происходит.

Является ли данное "ужесточение" типизации не багом, а фичей, и лечится ли это как-нибудь более элегантно, нежели через вызов дополнительного метода из Convert?


Ответ

Понятно, что упаковка и распаковка/копирование снижают производитель- ность приложения (в плане как замедления, так и расходования дополнительной памяти), поэтому нужно знать, когда компилятор сам создает код для выполнения этих операций, и стараться свести их к минимуму. При распаковке упакованного значимого типа происходит следующее.
Если переменная, содержащая ссылку на упакованный значимый тип, равна null, генерируется исключение NullReferenceException. Если ссылка указывает на объект, не являющийся упакованным значением требуемого значимого типа, генерируется исключение InvalidCastException1
Из Рихтера "CLR VIA 4.5"

Комментариев нет:

Отправить комментарий