Почему в `bool?` Нет поднятых операторов короткого замыкания?

Почему 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 , ему не нужно следовать правилам перегрузки для обычных типов, и поэтому он сможет предложить && / || без подъема истина .

18
задан Community 23 May 2017 в 12:33
поделиться