Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

Магия с Nullable-типами в .NET

Nullable<T> - классное нововведение (или, с учетом времени, - старовведение) CLR 2.0 как минимум в контексте работы с базой данных. Не хочу приводить список проблем, которые решают Nullable-типы, речь не о них. Хочу рассказать, как это работает.

Пример 1.
В результате на консоли - False. Стоп! А должен быть NullReferenceException, ведь i равна null! А равна ли? Ответ на этот вопрос в сгенерированном компилятором IL-коде, который выглядит приблизительно вот так:
Компилятор нас обманул, оператор i = null; превращается в i = new Nullable<Int32>();

Пример 2.
В результате на консоли - Int32. Стоп! А должен быть Nullable`Int32, ведь i имеет тип Nullable<Int32>! А имеет ли?... Условный IL-код:
Да, i имеет тип Nullable<Int32>. Теперь интересно, почему у o тип Int32? Ответ - в исходниках CLR (Rotor Shared Source), файл object.cpp, функции Nullable::Box и Nullable::UnBox
Приводить и разбирать тексты функций не хочу, просто обратите внимание на комментарии. Вывод: боксирование типа Nullable<T> выполняется CLR специальным образом - box(Value), если значение есть, и box(null), если значения нет. В результате тип боксированного значения - T, если значение было задано, а если не было - то выяснить его динамический тип невозможно.

1 коммент.:

Анонимный комментирует...

автор жжот

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

Copyright 2007-2011 Chabster