2010-02-26 14 views
40

Ho alcuni punti in cui ho bisogno di confrontare 2 valori (nullable) per vedere se sono uguali.Come confrontare i tipi nullable?

penso che ci dovrebbe essere qualcosa nel quadro a sostegno di questa, ma non riesce a trovare nulla, così invece hanno la seguente:

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

Poi, nel codice ho if (x.IsDifferentTo(y)) ...

Ho poi hanno metodi simili per valori nulli, valori netti, ecc.

Non c'è un modo più semplice per vedere se due tipi annullabili sono uguali?

Aggiornamento:

scopre che il motivo per cui questo metodo di esisteva era perché il codice è stato convertito da VB.Net, dove niente = niente restituisce false (confronta con C#, dove nulla == null restituisce true) . Il codice VB.Net avrebbe dovuto invece utilizzare .Equals....

+2

po 'in ritardo su questo, ma ho trovato l'aggiornamento utile. ha funzionato nello stesso scenario –

risposta

59

C# supporta gli operatori "sollevato", quindi se il tipo (bool? in questo caso) è noto al momento della compilazione si dovrebbe solo essere in grado di utilizzare:

return x != y; 

Se avete bisogno di farmaci generici, quindi EqualityComparer<T>.Default è tuo amico :

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

Si noti, tuttavia, che entrambi questi approcci utilizzare l'approccio "null == null" (contrasto ANSI SQL). Se avete bisogno di "null != null", allora si dovrà verificare che separatamente:

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

È possibile utilizzare il metodo statico Equals su System.Object:

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

+1 per lavorare con C# e VB.Net. – Crono

+0

Altre risposte affermano che 'x.Equals (y)' e 'x == y' funzionano bene quando x e/o y sono istanze di' Nullable '. Come è diverso il metodo collegato? Quando dovrebbe essere usato? – MarioDS

+1

Oppure 'Nullabe.Compare ' se stai cercando un 'IComparable ' impl – Sepehr

5

Basta usare == o .Equals().

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

Puoi dirmi perché questo downvote. Volevo solo sapere dove mi sbaglio. – Kashif

+0

Non ti ho fatto downvote, ma cosa succede se x è nullo? Il richiamo di un metodo su un riferimento null genererebbe probabilmente una NullReferenceException. –

+8

@Chris: dovresti invitare nuovamente la risposta. Un tipo nullable 'T?' NON è un tipo di riferimento, è un 'System.Nullable '.E questa è una struttura, quindi: un tipo di valore. Il codice di Muhammad è perfettamente legale e non genererà NullReferenceException se x è nullo. – Slauma

Problemi correlati