ChatGPT解决这个技术问题 Extra ChatGPT

How to compare nullable types?

I have a few places where I need to compare 2 (nullable) values, to see if they're the same.

I think there should be something in the framework to support this, but can't find anything, so instead have the following:

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

Then, within code I have if (x.IsDifferentTo(y)) ...

I then have similar methods for nullable ints, nullable doubles etc.

Is there not an easier way to see if two nullable types are the same?

Update:

Turns out that the reason this method existed was because the code has been converted from VB.Net, where Nothing = Nothing returns false (compare to C# where null == null returns true). The VB.Net code should have used .Equals... instead.

bit late on this but I found the update useful. ran into the same scenario

M
Marc Gravell

C# supports "lifted" operators, so if the type (bool? in this case) is known at compile you should just be able to use:

return x != y;

If you need generics, then EqualityComparer<T>.Default is your friend:

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

Note, however, that both of these approaches use the "null == null" approach (contrast to ANSI SQL). If you need "null != null" then you'll have to test that separately:

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

A
Anton Gogolev

Nullable.Equals<T>?


Other answers are claiming that x.Equals(y) and x == y work just fine when x and/or y are instances of Nullable<T>. How is the linked method different? When should it be used?
Or Nullabe.Compare<T> if you are looking for an IComparable<T> impl
K
Kashif
if (x.Equals(y)) 

Can you please tell me why this downvote. Just wanted to know where I am wrong.
I didn't downvote you, but what happens if x is null? Invoking a method on a null reference would probably result in a NullReferenceException.
@Chris: You should upvote the answer again. A nullable type T? is NOT a reference type, it's a System.Nullable<T>. And this is a struct, so: a value type. Muhammad's code is perfectly legal and won't throw a NullReferenceException if x is null.
@Chris: Oh, sorry, sorry, I misread that you did NOT downvote the answer, so you are free to upvote or not ;)
M
Mark Seemann

You can use the static Equals method on System.Object:

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

L
Lucero

Use Compare:

http://msdn.microsoft.com/en-us/library/dxxt7t2a.aspx


You don't need compare to check for equality; this is only needed for real comparison such as for sorting.
L
Lucero

Just use ==, or .Equals().


h
hdd42

I wanted to find how to compare two nullable int on C#, but I always get this link after search, so if someone needs to compare exactly two nullable int, then this can be helpful

a.GetValueOrDefault(int.MinValue).CompareTo(b.GetValueOrDefault(long.MinValue));


Z
Zoe stands with Ukraine
(x?? 0).Equals(y)

will handle null as well as equals.