¿Por qué el soporte bool?
no se levantó &&
y ||
? Podrían haber levantado los operadores true
y false
que indirectamente habrían agregado &&
y ||
levantados.¿Por qué no hay operadores de cortocircuito elevados en `bool?`?
Los operadores |
y &
ya están levantados e implementan el Three-valued logic correcto. Pero, por supuesto, no están en cortocircuito como ||
y &&
.
La pregunta es por qué decidieron no levantar esos operadores al crear la especificación. Entonces, "es así porque la especificación lo dice", no hay respuesta al "¿por qué?".
Al levantar true
y false
de manera que no es ni null
true
ni 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
}
Esto habría dado lugar a &&
y ||
comportarse igual que sus contrapartes no-cortocircuito. Excepto que false && anything
y true || anything
serían cortocircuitos (false
y true
no hay constantes de tiempo de compilación en estos dos ejemplos).
Esto funcionaría muy similar al DBBool example on MSDN.
No veo ningún comportamiento sorprendente o peligroso al levantar estos operadores. ¿Me he perdido algo?
He leído another SO question sobre esto, pero no encontré ninguna de las respuestas satisfactoria.
respuesta de Jeff Yates muestra una buena razón de por qué el levantamiento de las true
/false
operadores no es óptima, no explica por qué levantar &&
y ||
directamente es malo. Como el levantamiento del operador es mágico para el compilador, en casos especiales Nullable<T>
no es necesario seguir las reglas de sobrecarga para tipos normales y, por lo tanto, podría ofrecer &&
/||
sin levantar true
.
¿No supondría esto que NULL significa falso? No todos estarían de acuerdo con eso. En, por ejemplo, La teoría relacional (y SQL) 'NULL AND true, NULL y NULL, FALSE O NULL' es .. NULL, que no es verdadera ni falsa – nos
El operador' false' aplicado a 'null' devuelve false. Esto lleva a que '&&' no cortocircuite y devuelva 'null y cualquier cosa' en su lugar. – CodesInChaos
http://en.wikipedia.org/wiki/Three-valued_logic – Jan