Комментарии 5

Не знал про особенность упаковки nullable, спасибо.
После прочтения сразу возник вопрос — а как работает оператор is?
Ну, для nullable естественно проверяется значение HasValue через get_HasValue.
Дальше — интереснее. Если проверять, скажем, object? на тип T, то используется isinst инструкция.
Т.к. упаковка nullable упаковывает на самом деле значение, то
object x = (object)new int?(5);
и x is int && x is int? вернет true.
Это так же значит, что запакованный nullable можно распаковать как в nullable, так и в базовый тип (т.е. в условный int? и в int).
Немного кода на шарплэбе, который можно запустить.


Отдельный бонус офф-топик — до меня только сейчас дошло, что паттерн not можно повторять много раз подряд, наприме x is null и x is not not not not null это валидные синтаксические конструкции, которые куомпилируются в идентичный IL.

Я на c# ничего не пишу, но насколько я понимаю тут вся логика держится на знании/не знании того что имеет значение флаг hasValue (а не сам объект). Догадаться до этого никак нельзя — просто так реализовано. Могло быть наверно реализовано по-другому.@

Как вы это ловко заметили! Спасибо, исправил.
Приз за внимательность определённо ваш. :)

Интересно. Но это один из тех случаев, когда если я увижу код эксплуатирующий данные знания не как результат ошибки, и не увижу к ней развернуто комментария — руки программисту оторву. :/

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.
Информация
Дата основания

1 января 2008

Местоположение

Россия

Численность

31–50 человек

Дата регистрации

6 мая 2013

Блог на Хабре