Почему поддержка bool?
не поддерживается &&
и ||
? Они могли бы поднять операторы true
и false
, которые косвенно добавили бы поднятые &&
и ||
.
Операторы |
и &
уже сняты и реализуют правильную трехзначную логику. Но, конечно, они не имеют короткого замыкания, например ||
и &&
.
Вопрос в том, почему они решили не поднимать этих операторов при создании спецификации. Итак, "Это так, потому что спецификация говорит так" - это не ответ на "почему?".
При подъеме true
и false
, так что null
не является ни 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 && anything
и true || anything
будут иметь короткое замыкание (false
и true
не являются константами времени компиляции в этих двух примерах).
Это будет очень похоже на пример DBBool на MSDN.
Я не вижу неожиданного или опасного поведения, возникающего при подъеме этих операторов. Я что-то пропустил?
Я прочитал другой вопрос SO об этом, но не нашел ни одного из ответов, удовлетворяющих.
Ответ Джеффа Йетса показывает хорошую причину того, почему подъем операторов true
/false
не является оптимальным, он не объясняет, почему подъем &&
и ||
напрямую является плохим. Поскольку подъем оператора - это магия компилятора, в специальных случаях Nullable<T>
ему не нужно следовать правилам перегрузки для нормальных типов и, таким образом, сможет предложить &&
/||
без подъема true
.