¿Por qué no hay operadores de cortocircuito elevados en `bool?`?
Por qué nobool?
soporte levantado&&
y||
? Podrían haber levantado latrue
yfalse
operadores que hubieran agregado indirectamente levantados&&
y||
.
Los operadores|
y&
ya están levantadas e implementan la @ correc Lógica de tres valores. Pero, por supuesto, no están en corto circuito como||
y&&
.
La pregunta es por qué decidieron no levantar a esos operadores al crear la especificación. Entonces "Es así porque la especificación lo dice" no es una respuesta al "¿por qué?".
Al levantartrue
yfalse
así que esonull
Es ningunotrue
norfalse
:
public static bool operator true(bool? x)
{
return x.HasValue && x.Value
}
public static bool operator false(bool? x)
{
return x.HasValue && !x.Value
}
Esto habría resultado en&&
y||
se comportan igual que sus contrapartes sin cortocircuito. Excepto esofalse && anything
ytrue || anything
cortocircuitaría false
ytr,ue
no son constantes de tiempo de compilación en estos dos ejemplos).
Esto funcionaría de manera muy similar aDBBool ejemplo en MSDN.
No veo un comportamiento sorprendente o peligroso introducido al levantar estos operadores. ¿Me he perdido algo
He leído otra pregunta SO en esto, pero no encontré ninguna de las respuestas satisfactorias.
a respuesta de @Jeff Yates muestra una buena razón por la cual levantar eltrue
/false
operadores no es óptimo, no explica por qué levantar&&
y||
directamente es malo. Dado que el levantamiento del operador es la magia del compilador que casos especialesNullable<T>
no necesita seguir las reglas de sobrecarga para los tipos normales y, por lo tanto, podría ofrecer&&
/||
sin levantartrue
.