NullableTypes y operadores

30/10/2007 - 22:49 por news.microsoft.com | Informe spam
Hola grupo:

Estuve mirando un poco los tipos anulables y la verdad estoy sorprendido
sobre algunos resultados.
Ejemplo:

Nullable<Int32> nullableOne = 1;
Nullable<Int32> nullableNull=null;
Console.WriteLine(nullableOne > nullableNull); => False
Console.WriteLine(nullableOne == nullableNull); => False
Console.WriteLine(nullableOne < nullableNull); => False

Console.WriteLine(nullableOne >= nullableNull); =>False
Console.WriteLine(nullableOne < nullableNull);=>False

La verdad hubiera supuesto que la comparacion de una variable con un valor
no nulo y otra con un valor nulo, desconocido, daría como resultado Null.
En las ultimas dos lineas, yo hubiera supuesto que si se compara si una
variable es mayor o igual a otra y devuelve false, entences esa variable
sería menor.

Bueno y este ultimo es terrible

Nullable<Int32> firstNull = null;
Nullable<Int32> lastNull=null;
Console.WriteLine(firstNull == lastNull); =>True
Console.WriteLine(firstNull >= lastNull); =>False

La primer comparacion, da true, ahora resulta que si son iguales, pero la
comparación de mayor o igual da falso.
Alguien sabe si esto lo van a arreglar o es el comportramioento deseado??

Saludos

Preguntas similare

Leer las respuestas

#6 hugo
01/11/2007 - 17:08 | Informe spam
Bueno, existe total posibilidad de comparar un valor booleano con null desde
el momento que existe el generico Nullable( bool).
Si tienes una variable asi definida, existe siempre la poibilidad de que la
misma no sea ni true ni false.
En ese caso es donde los resultrados pueden ser contradictorios.
Un ejemplo muy llamativo es el que puse en el primer mensaje con
nullable(int).
Console.WriteLine(firstNull == lastNull); =>True
Console.WriteLine(firstNull >= lastNull); =>False

Si dis variables son iguales, la compareación de mayor o igual debe dar
verdadero.

Como lo veo yo, los operadores deberían funcionar con NullableTypes
exactamnete igual a como lo hacen en las bases de datos.
En general, los motores de bases de datos, devuelven null cuando se compara
un valor con nulo.
Es más, dos valores nulos no son iguales.
Como yo lo ve, desde un punto de vista lógico, la comparación entre TRUE AND
NULL debe dar necesaria mnete Null, dado que es comparar TRUE AND
DESCONOCIDO.
Como comentario final, estuve buscando como hace esto visual basic. En la
version actual (2005) no tiene definidos los operadores para NullablesTypes,
pero en la proxima versión si lso tiuene.
Por lo que he leido, es Visual Basic 2008, si se compara TRUE AND NULL, va
a devolver NULL.
1 > NULL devolvería NULL.
Esto es lo que encontre en internet, habrá que esperar a ver cuando salga la
próxima versión.
Ahora no entiendo como no te sorprender que los NullableTypes funcionen en
C# tan diferente a como lo hacen en las bases de datos.
Saludos

"Hernan" escribió en el mensaje
news:
Estuve mirando un poco los tipos anulables y la verdad estoy


sorprendido
sobre algunos resultados.

La verdad hubiera supuesto que la comparación de una variable con un valor
no nulo y otra con un valor nulo, desconocido, daría como resultado Null.

En las ultimas dos lineas, yo hubiera supuesto que si se compara si una
variable es mayor o igual a otra y devuelve false, entonces esa variable
sería menor.

La primer comparación, da true, ahora resulta que si son iguales, pero la
comparación de mayor o igual da falso.

Alguien sabe si esto lo van a arreglar o es el comportamiento deseado??



A mí me sorprende tu sorpresa. ;-)

Como regla general, lo única comparación que deberías hacer con un
objeto nulo es compararlo con nulo. En C# no hay valor "booleano
desconocido" o es true o es false. Aquí *no* existe la lógica
trivaluada.

Tendrías que inventarte algo como Nullable<bool>, sobrecargar todos
los
operadores de comparación para que lo utilicen...Y ni así, porque
¿Cómo los usarías en expresiones o sentencias que esperan un bool.?

Resumiendo. Usa los Nullable con cuentagotas. Para lo que pueden
servir se quedan cortos.
Respuesta Responder a este mensaje
#7 Octavio Hernandez
02/11/2007 - 09:59 | Informe spam
bool? x;
// ...
if (x.HasValue)
if (x.HasValue)
{
// true
}
else
{
// false
}
else
{
// null
}

Saludos - Octavio


wrote in message
news:
vaya yo no sé mucho de sql pero eso para mi si ke está raro me
pregunto como trabajas con tu condición por ejemplo en un ifelse
la estructura del if...else if. else es de dos opciones hasta
donde conozco me pregunto como le haras desde sql con la estructura de
la condición if.else if..else para el caso de ke el valor sea
desconocido no comozco dentro de la estructura if.else una tercera
o cuarta ke diga ke en caso de ke el valor sea desconocido
Respuesta Responder a este mensaje
#8 Octavio Hernandez
02/11/2007 - 12:41 | Informe spam
Mis disculpas, en el segundo if debe ir "x.Value" y no "x.HasValue":

bool? x;
// ...
if (x.HasValue)
if (x.Value)
{
// true
}
else
{
// false
}
else
{
// null
}

Saludos - Octavio


"Octavio Hernandez" wrote in message
news:

bool? x;
// ...
if (x.HasValue)
if (x.HasValue)
{
// true
}
else
{
// false
}
else
{
// null
}

Saludos - Octavio


wrote in message
news:
vaya yo no sé mucho de sql pero eso para mi si ke está raro me
pregunto como trabajas con tu condición por ejemplo en un ifelse
la estructura del if...else if. else es de dos opciones hasta
donde conozco me pregunto como le haras desde sql con la estructura de
la condición if.else if..else para el caso de ke el valor sea
desconocido no comozco dentro de la estructura if.else una tercera
o cuarta ke diga ke en caso de ke el valor sea desconocido

Respuesta Responder a este mensaje
#9 Hernan
02/11/2007 - 14:00 | Informe spam
Bueno, existe total posibilidad de comparar un valor booleano con null desde
el momento que existe el generico Nullable( bool).
Si tienes una variable asi definida, existe siempre la poibilidad de que la
misma no sea ni true ni false.
En ese caso es donde los resultrados pueden ser contradictorios.
Un ejemplo muy llamativo es el que puse en el primer mensaje con
nullable(int).
Console.WriteLine(firstNull == lastNull); =>True
Console.WriteLine(firstNull >= lastNull); =>False

Si dis variables son iguales, la compareación de mayor o igual debe dar
verdadero.

Como lo veo yo, los operadores deberían funcionar con NullableTypes
exactamnete igual a como lo hacen en las bases de datos.
En general, los motores de bases de datos, devuelven null cuando se compara
un valor con nulo.
Es más, dos valores nulos no son iguales.
Como yo lo ve, desde un punto de vista lógico, la comparación entre TRUE AND
NULL debe dar necesaria mnete Null, dado que es comparar TRUE AND
DESCONOCIDO.
Como comentario final, estuve buscando como hace esto visual basic. En la
version actual (2005) no tiene definidos los operadores para NullablesTypes,
pero en la proxima versión si lso tiuene.
Por lo que he leido, es Visual Basic 2008, si se compara TRUE AND NULL, va
a devolver NULL.
1 > NULL devolvería NULL.
Esto es lo que encontre en internet, habrá que esperar a ver cuando salga la
próxima versión.
Ahora no entiendo como no te sorprender que los NullableTypes funcionen en
C# tan diferente a como lo hacen en las bases de datos.



Repito una vez mas. C# *no* tiene lógica trivaluada. C# *no es* SQL.
Que hayan agregado un genérico Nullable no cambia nada del álgebra
booleana
del lenguaje. Es mas, si incorporaran la logica de SQL harían
incompatible
el 99% del código C# existente en la actualidad. La expresiones
( objeto == null ) o ( objeto1 == objeto2 )
dejarían de funcionar en caso que algun objeto fuera nulo.

Para lo que podrían servir los Nullable es para pasarlos como
parámetros
en sentencias SQL. Por desgracia, tampoco son muy útiles porque ADO
no hace nada con ellos.





"Hernan" escribió en el mensajenews:

> Estuve mirando un poco los tipos anulables y la verdad estoy
sorprendido
> sobre algunos resultados.

> La verdad hubiera supuesto que la comparación de una variable con un valor
> no nulo y otra con un valor nulo, desconocido, daría como resultado Null.

> En las ultimas dos lineas, yo hubiera supuesto que si se compara si una
> variable es mayor o igual a otra y devuelve false, entonces esa variable
> sería menor.

> La primer comparación, da true, ahora resulta que si son iguales, pero la
> comparación de mayor o igual da falso.

> Alguien sabe si esto lo van a arreglar o es el comportamiento deseado??

A mí me sorprende tu sorpresa. ;-)

Como regla general, lo única comparación que deberías hacer con un
objeto nulo es compararlo con nulo. En C# no hay valor "booleano
desconocido" o es true o es false. Aquí *no* existe la lógica
trivaluada.

Tendrías que inventarte algo como Nullable<bool>, sobrecargar todos
los
operadores de comparación para que lo utilicen...Y ni así, porque
¿Cómo los usarías en expresiones o sentencias que esperan un bool.?

Resumiendo. Usa los Nullable con cuentagotas. Para lo que pueden
servir se quedan cortos.
Respuesta Responder a este mensaje
#10 news.microsoft.com
03/11/2007 - 02:16 | Informe spam
Bueno, yo también te repito que desde el momento que se utiloiza nullable
types, hay logica de tres valores.
Y Con decir que c# no es sql no se justifica que las comparaciones de
valores con nulos sean incoerentes.
True And Desconocido es desconocido en cualquier lenguaje que quiera segir
una lógica.
Disculpa si lo repito, quizas no lo hayas leido en ninguno de los mensajes
anteriores

Console.WriteLine(firstNull == lastNull); =>True
Console.WriteLine(firstNull >= lastNull); =>False

Como dos cosas iguales dan false en >=.
Abre nu priyecto y velo tu mismo.

"Hernan" escribió en el mensaje
news:
Bueno, existe total posibilidad de comparar un valor booleano con null


desde
el momento que existe el generico Nullable( bool).
Si tienes una variable asi definida, existe siempre la poibilidad de que


la
misma no sea ni true ni false.
En ese caso es donde los resultrados pueden ser contradictorios.
Un ejemplo muy llamativo es el que puse en el primer mensaje con
nullable(int).
Console.WriteLine(firstNull == lastNull); =>True
Console.WriteLine(firstNull >= lastNull); =>False

Si dis variables son iguales, la compareación de mayor o igual debe dar
verdadero.

Como lo veo yo, los operadores deberían funcionar con NullableTypes
exactamnete igual a como lo hacen en las bases de datos.
En general, los motores de bases de datos, devuelven null cuando se


compara
un valor con nulo.
Es más, dos valores nulos no son iguales.
Como yo lo ve, desde un punto de vista lógico, la comparación entre TRUE


AND
NULL debe dar necesaria mnete Null, dado que es comparar TRUE AND
DESCONOCIDO.
Como comentario final, estuve buscando como hace esto visual basic. En la
version actual (2005) no tiene definidos los operadores para


NullablesTypes,
pero en la proxima versión si lso tiuene.
Por lo que he leido, es Visual Basic 2008, si se compara TRUE AND NULL,


va
a devolver NULL.
1 > NULL devolvería NULL.
Esto es lo que encontre en internet, habrá que esperar a ver cuando salga


la
próxima versión.
Ahora no entiendo como no te sorprender que los NullableTypes funcionen en
C# tan diferente a como lo hacen en las bases de datos.



Repito una vez mas. C# *no* tiene lógica trivaluada. C# *no es* SQL.
Que hayan agregado un genérico Nullable no cambia nada del álgebra
booleana
del lenguaje. Es mas, si incorporaran la logica de SQL harían
incompatible
el 99% del código C# existente en la actualidad. La expresiones
( objeto == null ) o ( objeto1 == objeto2 )
dejarían de funcionar en caso que algun objeto fuera nulo.

Para lo que podrían servir los Nullable es para pasarlos como
parámetros
en sentencias SQL. Por desgracia, tampoco son muy útiles porque ADO
no hace nada con ellos.





"Hernan" escribió en el


mensajenews:

> Estuve mirando un poco los tipos anulables y la verdad estoy
sorprendido
> sobre algunos resultados.

> La verdad hubiera supuesto que la comparación de una variable con un


valor
> no nulo y otra con un valor nulo, desconocido, daría como resultado


Null.

> En las ultimas dos lineas, yo hubiera supuesto que si se compara si una
> variable es mayor o igual a otra y devuelve false, entonces esa variable
> sería menor.

> La primer comparación, da true, ahora resulta que si son iguales, pero


la
> comparación de mayor o igual da falso.

> Alguien sabe si esto lo van a arreglar o es el comportamiento deseado??

A mí me sorprende tu sorpresa. ;-)

Como regla general, lo única comparación que deberías hacer con un
objeto nulo es compararlo con nulo. En C# no hay valor "booleano
desconocido" o es true o es false. Aquí *no* existe la lógica
trivaluada.

Tendrías que inventarte algo como Nullable<bool>, sobrecargar todos
los
operadores de comparación para que lo utilicen...Y ni así, porque
¿Cómo los usarías en expresiones o sentencias que esperan un bool.?

Resumiendo. Usa los Nullable con cuentagotas. Para lo que pueden
servir se quedan cortos.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida