2010-02-26 11 views
40

Mam kilka miejsc, w których muszę porównać 2 (wartości zerowe), aby sprawdzić, czy są takie same.Jak porównać typy nullable?

myślę, że powinno być coś w ramach wspierania tego, ale nie mogę znaleźć nic, więc zamiast tego są następujące:

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

Następnie kodem mam if (x.IsDifferentTo(y)) ...

Potem mają podobne metody dla zerowych int, dublerów podwójnych itp.

Czy nie ma prostszego sposobu sprawdzenia, czy dwa typy zerowania są takie same?

Aktualizacja:

Okazuje się, że powodem tego była metoda istniała, ponieważ kod został przekształcony z VB.NET, gdzie nic = Nic nie zwraca false (w porównaniu do C# gdzie null == null zwraca true) . Kod VB.Net powinien był zamiast tego użyć .Equals....

+2

trochę późno na to, ale uważam, że zmiana użyteczne. wpadł na ten sam scenariusz –

Odpowiedz

59

C# obsługuje „podnoszony” operatorzy, więc jeśli typ (bool? w tym przypadku) jest znany w czasie kompilacji należy po prostu być w stanie używać:

return x != y; 

Jeśli potrzebujesz leków generycznych, a następnie EqualityComparer<T>.Default jest twoim przyjacielem :

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

Należy jednak pamiętać, że oba te podejścia stosowanie metody "null == null" (kontrast ANSI SQL). Jeśli potrzebujesz „null != null”, a następnie trzeba będzie sprawdzić, czy osobno:

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

Można użyć statycznej Equals metodę na System.Object:

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

+1 do pracy z C# i VB.Net. – Crono

+0

Inne odpowiedzi twierdzą, że 'x.Equals (y)' i 'x == y' działają poprawnie, gdy x i/lub y są instancjami' Nullable '. Czym różni się połączona metoda? Kiedy należy go użyć? – MarioDS

+1

Lub 'Nullabe.Compare ' jeśli szukasz 'IComparable ' impl – Sepehr

5

Wystarczy użyć == lub .Equals().

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

Czy możesz mi powiedzieć, dlaczego to się stało. Chciałem tylko wiedzieć, gdzie się mylę. – Kashif

+0

Nie przesłałem ci tego, ale co się stanie, jeśli x jest zerowe? Wywołanie metody na odwołaniu zerowym prawdopodobnie spowodowałoby wyjątek NullReferenceException. –

+8

@ Chris: Powinieneś powtórzyć odpowiedź. Null typu 'T?' NIE jest typem odniesienia, jest 'System.Nullable '.A to jest struktura, więc: typ wartości. Kod Muhammada jest całkowicie legalny i nie rzuci wyjątku NullReferenceException, jeśli x ma wartość null. – Slauma