Parece que el artículo de MSDN al que lo vinculó se proporcionó para permitir tipos booleanos que aceptan valores NULL antes de que el tipo Nullable (es decir, int ?, bool ?, etc.) se introduzca en el lenguaje en C # 2. Por lo tanto, almacenaría un valor interno que indique si el valor es verdadero, falso o nulo, es decir, en su ejemplo> 0 para verdadero, <0 para falso y == 0 para nulo, y luego obtendría una semántica nula de estilo SQL. También tendría que implementar un método o propiedad .IsNull para que la nulidad se pueda verificar explícitamente.
En comparación con SQL, imagine una tabla Tabla con 3 filas con el valor Foo establecido en verdadero, 3 filas con el valor Foo establecido en falso y 3 filas con el valor Foo establecido en nulo.
SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE
6
Para contar todas las filas, tendría que hacer lo siguiente: -
SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE OR Foo IS NULL
9
Esta sintaxis 'IS NULL' tendría un código equivalente en su clase como .IsNull ().
LINQ hace que la comparación con C # sea aún más clara: -
int totalCount = (from s in MyTypeEnumerable
where s || !s
select s).Count();
Imaginando que MyTypeEnumberable tiene exactamente el mismo contenido de la base de datos, es decir, 3 valores iguales a verdadero, 3 valores iguales a falso y 3 valores iguales a nulo. En este caso, totalCount se evaluaría a 6 en este caso. Sin embargo, si reescribimos el código como: -
int totalCount = (from s in MyTypeEnumerable
where s || !s || s.IsNull()
select s).Count();
Entonces totalCount evaluaría a 9.
El ejemplo de DBNull proporcionado en el artículo vinculado de MSDN sobre el operador falso demuestra una clase en el BCL que tiene este comportamiento exacto.
En efecto, la conclusión es que no debe usar esto a menos que esté completamente seguro de que desea este tipo de comportamiento, ¡es mejor usar la sintaxis anulable mucho más simple!
Actualización: ¡Acabo de notar que necesitas anular manualmente los operadores lógicos!, || y && para que esto funcione correctamente. Creo que el operador falso se alimenta de estos operadores lógicos, es decir, indica la verdad, la falsedad o "lo contrario". Como se señaló en otro comentario,! X no funcionará desde el principio; ¡tienes que sobrecargar! ¡Rareza!