2010-02-26 8 views
40

Ich habe ein paar Stellen, wo ich 2 (Nullable) Werte vergleichen muss, um zu sehen, ob sie gleich sind.Vergleichbare Nullwerttypen?

denke ich, es ist etwas im Rahmen sein sollte, dies zu unterstützen, kann aber nichts finden, so stattdessen haben die folgenden:

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

Dann im Code ich habe if (x.IsDifferentTo(y)) ...

ich dann ähnliche Methoden für Nullable-Ints, Nullable-Doubles usw. haben

Gibt es keinen einfacheren Weg, um zu sehen, ob zwei Nullable-Typen gleich sind?

Update:

Es stellte sich heraus, dass der Grund, warum diese Methode existiert, weil der Code von VB.Net umgewandelt wurde, wo Nothing = Nothing false zurück (vergleiche zu C#, wobei null == null true zurückgibt) . Der VB.Net-Code sollte stattdessen .Equals... verwendet haben.

+2

bisschen spät auf dieses, aber ich das Update nützlich gefunden. lief in das gleiche Szenario –

Antwort

59

C# unterstützt „angehoben“ Betreiber, so dass, wenn die Art (bool? in diesem Fall) bei der Kompilierung bekannt ist, sollten Sie nur in der Lage sein zu verwenden:

return x != y; 

Wenn Sie Generika benötigen, dann EqualityComparer<T>.Default ist dein Freund :

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

Beachten Sie jedoch, dass diese beiden Ansätze, um den "null == null" Ansatz verwendet (Gegensatz zu ANSI SQL). Wenn Sie „null != null“ dann werden Sie das separat testen müssen:

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

Sie können die statische Equals Methode auf System.Object verwenden:

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

+1 für die Arbeit mit C# und VB.Net. – Crono

+0

Andere Antworten behaupten, dass 'x.Equals (y)' und 'x == y' gut funktionieren, wenn x und/oder y Instanzen von' Nullable 'sind. Wie unterscheidet sich die verknüpfte Methode? Wann sollte es verwendet werden? – MarioDS

+1

Oder 'Nullase.Compare ' wenn Sie nach einem 'IComparable ' impl – Sepehr

5

Nur == verwenden oder .Equals().

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

Können Sie mir bitte sagen, warum dieser Downvote. Ich wollte nur wissen, wo ich falsch liege. – Kashif

+0

Ich habe Sie nicht downvote, aber was passiert, wenn x null ist? Das Aufrufen einer Methode für eine Nullreferenz würde wahrscheinlich zu einer NullReferenceException führen. –

+8

@Chris: Sie sollten die Antwort erneut upvote. Ein Nullable Typ 'T?' Ist kein Referenztyp, es ist ein 'System.Nullable '.Und das ist eine Struktur, also: ein Werttyp. Muhammads Code ist vollkommen legal und wird keine NullReferenceException werfen, wenn x null ist. – Slauma

Verwandte Themen