Комментарии 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
.
У вас в IsDefaultVerbose() отрицание отклеилось.
Интересно. Но это один из тех случаев, когда если я увижу код эксплуатирующий данные знания не как результат ошибки, и не увижу к ней развернуто комментария — руки программисту оторву. :/
Хорошо ли вы помните nullable value types? Заглядываем «под капот»