Почему поддержка 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.