2011-06-09 21 views
5

Estoy tratando de comparar dos variables de tipo nullable(of boolean) en VB.NET 2010. Una de las variables tiene un valor False y la otra es Nothing. Ahora que estaba esperando la siguiente expresión para evaluar a verdadero, pero este no es el caso:comparing nullable (of boolean)

Dim var1 as nullable(of boolean) = False 
Dim var2 as nullable(of boolean) 
var2 = Nothing 

If var1 <> var2 Then 
msgbox "they are different" 
End If 

¿Por qué no puedo ver mi MsgBox? ¿Cómo debería comparar dos nulables (de booleano)?

+0

La forma correcta de mostrar cuadro de mensaje es MsgBox ("son diferentes") – user774411

Respuesta

19

Nullable.EqualsIndica si dos especificada anulable (Of T) objetos son iguales .

If Not Nullable.Equals(var1, var2) Then 
     MsgBox("they are different") 
    End If 
+0

que funciona! Gracias. – Lukasz

+1

Ah, ¿mucho mejor que el booleano? disparates. –

0

Creo que las variables anulables tienen una propiedad Value y HasValue. http://msdn.microsoft.com/en-US/library/19twx9w9(v=VS.80).aspx

Esencialmente usted tiene que decir:

If (var1.HasValue And var2.HasValue) And (var1.Value <> var2.Value) Then 
     ' 
End If 

Ha sido bastante tiempo desde que escribí VB. Normalmente soy un tipo C#. El concepto anterior es correcto, sin embargo.

+0

Este código no va a hacer el trabajo si var1 var2 es nulo, pero tiene un valor – Alireza

2

Esto se debe a que en VB.NET

Console.WriteLine(False = Nothing) 

impresiones True.

Esto no tiene nada que ver con la capacidad de nulidad.

2

También puede crear una función que los compare por usted.

Function compareNullableBooleans(ByVal firstBool As Nullable(Of Boolean), _ 
           ByVal secondBool As Nullable(Of Boolean)) 
    If firstBool.HasValue And secondBool.HasValue Then 
     Return (firstBool = secondBool) 
    ElseIf firstBool.HasValue And secondBool.HasValue = False Then 
     Return False 
    ElseIf firstBool.HasValue = False And secondBool.HasValue = True Then 
     Return False 
    Else 
     Return True 
    End If 
End Function 

Esto debería funcionar de la manera que quiere que, aunque le sugiero que cambie el nombre de la función, porque es bastante largo: p