2010-02-26 10 views
40

Tengo algunos lugares en los que necesito comparar 2 valores (anulables) para ver si son iguales.¿Cómo comparar tipos que aceptan nulos?

Creo que debe haber algo en el marco de apoyo a esto, pero no puedo encontrar nada, así que en vez tener lo siguiente:

public static bool IsDifferentTo(this bool? x, bool? y) 
{ 
    return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value; 
} 

Luego, en el código que tengo if (x.IsDifferentTo(y)) ...

que entonces tienen métodos similares para entradas anulables, dobles que se pueden nulos, etc.

¿No hay una manera más fácil de ver si dos tipos que aceptan nulos son los mismos?

Actualización:

Resulta que la razón existía este método se debía a que el código se ha convertido de VB.Net, donde nada = Nada devuelve falso (en comparación con C# donde nula == null devuelve verdadero) . El código VB.Net debería haber usado .Equals... en su lugar.

+2

poco tarde en esto, pero me encontré con la actualización de utilidad. se encontró con el mismo escenario –

Respuesta

59

C# soporta "levantadas" operadores, por lo que si el tipo (bool? en este caso) es conocido en tiempo de compilación que sólo debe ser capaz de utilizar:

return x != y; 

Si necesita genéricos, a continuación, EqualityComparer<T>.Default es su amigo :

return !EqualityComparer<T>.Default.Equals(x,y); 

Nótese, sin embargo, que estos dos enfoques utilizan el enfoque "null == null" (contraste con ANSI SQL). Si necesita "null != null", entonces tendrá que probar que por separado:

return x == null || x != y; 
5

Se puede utilizar el método estático Equals de System.Object:

var equal = object.Equals(objA, objB); 
25
+3

+1 para trabajar con C# y VB.Net. – Crono

+0

Otras respuestas afirman que 'x.Equals (y)' y 'x == y' funcionan bien cuando x y/o son instancias de' Nullable '. ¿Cómo es el método vinculado diferente? ¿Cuándo debería usarse? – MarioDS

+1

O 'Nullabe.Compare ' si está buscando un 'IComparable ' impl – Sepehr

5

sólo tiene que utilizar ==, o .Equals().

17
if (x.Equals(y)) 
+0

¿Puede decirme por qué este voto negativo? Solo quería saber dónde estoy equivocado. – Kashif

+0

No te devolví el voto, pero ¿qué sucede si x es nulo? Invocar un método en una referencia nula probablemente resultaría en una NullReferenceException. –

+8

@Chris: Deberías volver a votar la respuesta nuevamente. Un tipo que se puede nulos 'T?' NO es un tipo de referencia, es un 'System.Nullable '.Y esto es una estructura, entonces: un tipo de valor. El código de Muhammad es perfectamente legal y no lanzará una NullReferenceException si x es nulo. – Slauma

Cuestiones relacionadas