Estate atento porque en esta crónica encontrarás la solución que buscas.Este artículo fue analizado por nuestros expertos para garantizar la calidad y exactitud de nuestro contenido.
Solución:
VB.NET y C#.NET son lenguajes diferentes, construidos por diferentes equipos que han hecho diferentes suposiciones sobre el uso; en este caso, la semántica de una comparación NULL.
Mi preferencia personal es por la semántica de VB.NET, que en esencia le da a NULL la semántica “Todavía no lo sé”. Luego la comparación de 5 con “Todavía no lo sé”. es naturalmente “Todavía no lo sé”; es decir, NULO. Esto tiene la ventaja adicional de reflejar el comportamiento de NULL en (la mayoría, si no todas) las bases de datos SQL. Esta es también una interpretación más estándar (que la de C#) de la lógica de tres valores, como se explica aquí.
El equipo de C# hizo diferentes suposiciones sobre lo que significa NULL, lo que resultó en la diferencia de comportamiento que muestra. Eric Lippert escribió un blog sobre el significado de NULL en C#. Según Eric Lippert: “También escribí sobre la semántica de nulos en VB/VBScript y JScript aquí y aquí”.
En cualquier entorno en el que los valores NULL son posibles, es importante reconocer que la Ley del Medio Excluido (es decir, que A o ~A es tautológicamente true) ya no se puede confiar.
Actualizar:
A bool
(a diferencia de un bool?
) solo puede tomar los valores VERDADERO y FALSO. Sin embargo, una implementación de lenguaje de NULL debe decidir cómo NULL se propaga a través de expresiones. En VB las expresiones 5=null
y 5<>null
AMBOS regresan false. En C#, de las expresiones comparables 5==null
y 5!=null
Solo el segundo primero [updated 2014-03-02 – PG] devoluciones false. Sin embargo, en CUALQUIER entorno que admita nulles responsabilidad del programador conocer las tablas de verdad y null-propagación utilizada por esa lengua.
Actualizar
Los artículos del blog de Eric Lippert (mencionados en sus comentarios a continuación) sobre semántica están ahora en:
-
30 de septiembre de 2003 – Un montón de nada
-
1 de octubre de 2003 – Un poco más sobre nada
Porque x <> y
devoluciones Nothing
en vez de true
. Simplemente no está definido ya que x
no está definido. (similar a SQL null).
Nota: VB.NET Nothing
<> C# null
.
También tienes que comparar el valor de un Nullable(Of Decimal)
sólo si tiene un valor.
Entonces, el VB.NET anterior se compara de manera similar a esto (que parece menos incorrecto):
If x.HasValue AndAlso y.HasValue AndAlso x <> y Then
Console.WriteLine("true")
Else
Console.WriteLine("false")
End If
La especificación del lenguaje VB.NET:
7.1.1 Tipos de valores anulables
… Un tipo de valor anulable puede contener los mismos valores que la versión no anulable del tipo, así como el null valor. Por lo tanto, para un tipo de valor anulable, al asignar Nothing a una variable del tipo, se establece el valor de la variable en el null valor, no el valor cero del tipo de valor.
Por ejemplo:
Dim x As Integer = Nothing
Dim y As Integer? = Nothing
Console.WriteLine(x) ' Prints zero '
Console.WriteLine(y) ' Prints nothing (because the value of y is the null value) '
Mire el CIL generado (he convertido ambos a C#):
C#:
private static void Main(string[] args)
(CS$0$0000.HasValue != CS$0$0001.HasValue))
Console.WriteLine("true");
else
Console.WriteLine("false");
Básico visual:
[STAThread]
public static void Main()
decimal? x = null;
decimal? y = null;
y = 5M;
bool? VB$LW$t_struct$S3 = new bool?(decimal.Compare(x.GetValueOrDefault(), y.GetValueOrDefault()) != 0);
bool? VB$LW$t_struct$S1 = (x.HasValue & y.HasValue) ? VB$LW$t_struct$S3 : null;
if (VB$LW$t_struct$S1.GetValueOrDefault())
Console.WriteLine("true");
else
Console.WriteLine("false");
Verá que la comparación en Visual Basic devuelve Nullable
Nothing
comparado con lo que sea siempre Nothing
no false en Visual Basic (es lo mismo que en SQL).
Reseñas y valoraciones del tutorial
Al final de la página puedes encontrar las crónicas de otros gestores de proyectos, tú igualmente tienes la opción de dejar el tuyo si te apetece.