web-dev-qa-db-fra.com

Comment comparer les types nullables?

J'ai quelques endroits où j'ai besoin de comparer 2 valeurs (nullables), pour voir si elles sont identiques.

Je pense qu'il devrait y avoir quelque chose dans le cadre pour soutenir cela, mais je ne trouve rien, alors à la place, ayez les éléments suivants:

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

Ensuite, dans le code, j'ai if (x.IsDifferentTo(y)) ...

J'ai ensuite des méthodes similaires pour les ints nullables, les doubles nullables, etc.

N'y a-t-il pas un moyen plus simple de voir si deux types nullables sont identiques?

Mise à jour:

Il s'avère que la raison pour laquelle cette méthode existait était parce que le code a été converti à partir de VB.Net, où Nothing = Nothing renvoie false (par rapport à C # où null == null renvoie true). Le code VB.Net aurait dû utiliser .Equals... À la place.

55
David_001

C # prend en charge les opérateurs "levés", donc si le type (bool? dans ce cas) est connu lors de la compilation, vous devriez juste pouvoir utiliser:

return x != y;

Si vous avez besoin de génériques, alors EqualityComparer<T>.Default est votre ami:

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

Notez, cependant, que ces deux approches utilisent le "null == null "(contrairement à ANSI SQL). Si vous avez besoin de" null != null "alors vous devrez tester cela séparément:

return x == null || x != y;
69
Marc Gravell
36
Anton Gogolev
if (x.Equals(y)) 
22
Kashif

Vous pouvez utiliser la méthode statique Equals sur System.Object:

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

Utilisez simplement == Ou .Equals().

5
Lucero
3
Randy Minder