Предположим, что есть некоторый "опциональный" тип, то есть такой, который может кроме своих основных значений принимать еще и недействительное значение none. Для краткости пусть он обозначается в стиле c# nullable: T?
Рассмотрим вот такой код.
T? x = T(100,"hello"); // некая инициализация опционального типа, x != none
T y; // обычный (не опциональный) объект
y = x;
в последней строчке присваивание неопциональной переменной опционального значения.
Приходят в голову три варианта, как обрабатывать такое в языке программирования.
1. запретить. Всегда требовать явное преобразование типов (например с помощью методов isNone() и value() ). Наиболее "правильный" способ, но требующий больше всего писанины.
2. разрешить, но если x == none, то выбрасывать исключение
3. разрешить, но в случае если x == none, вычисление всего выражения (до ближайшей точки с запятой) пропускается (в данном случае y останется неинициализированной, но это наиболее простой случай)
Понятно что можно сочетать все три решения с помощью специальных операторов. Например, по умолчанию запрещать явное преобразование, а с помощью специальных операторов включать второй или третий способ развертки.
Интересно вообще обсудить это. Какие решения в каких языках применяются? Что предпочтительнее? Возможны ли еще варианты такого преобразования?