Почему bool?
не поддерживается &&
и ||
? Они могли бы поднять операторы true
и false
, которые косвенно добавили бы поднятые &&
и ||
.
Операторы |
и &
уже подняты и реализуют правильную трехзначную логику . Но, конечно, они не замыкаются накоротко, как ||
и &&
.
Вопрос в том, почему они решили не отменять эти операторы при создании спецификации. Итак, «Это так, потому что так сказано в спецификации» не является ответом на «почему?».
При отмене истины
и ложи
, так что ноль
не является ни истинным
, ни ложным
:
public static bool operator true(bool? x)
{
return x.HasValue && x.Value
}
public static bool operator false(bool? x)
{
return x.HasValue && !x.Value
}
Это привело бы к тому, что &&
и ||
вели себя так же, как и их отсутствие короткого замыкания аналоги. За исключением того, что false && something
и true || что-нибудь
может вызвать короткое замыкание ( false
и true
не являются константами времени компиляции в этих двух примерах).
Это будет работать очень похоже на пример DBBool на MSDN .
Я не вижу удивительного или опасного поведения, вызванного поднятием этих операторов. Я что-то пропустил?
Я прочитал еще один вопрос SO по этому поводу, но не нашел удовлетворительного ответа.
Ответ Джеффа Йейтса показывает хорошую причину, по которой отменяется истина
/ false
операторы не оптимальны, они не объясняют, почему прямое поднятие &&
и ||
плохо. Поскольку подъем оператора - это магия компилятора в особых случаях Nullable
, ему не нужно следовать правилам перегрузки для обычных типов, и поэтому он сможет предложить &&
/ ||
без подъема истина
.