Почему 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
.