Null ou de comparaison par défaut de l'argument générique en C#

J'ai une méthode générique défini comme ceci:

public void MyMethod<T>(T myArgument)

La première chose que je veux faire est de vérifier si la valeur de myArgument est la valeur par défaut pour ce type, quelque chose comme ceci:

if (myArgument == default(T))

Mais cela ne veut pas compiler, car je n'ai pas la garantie que T va mettre en œuvre l'opérateur==. Donc j'ai changé le code de cette:

if (myArgument.Equals(default(T)))

Maintenant cette compile, mais échouera si myArgument est nulle, ce qui est une partie de ce que je suis en essais pour. Je peux ajouter une valeur null explicite case comme ceci:

if (myArgument == null || myArgument.Equals(default(T)))

Maintenant c'est redondant pour moi. ReSharper est même ce qui suggère que je change le myArgument == null part dans myArgument == défaut(T) qui est l'endroit où j'ai commencé. Est-il une meilleure façon de résoudre ce problème?

J'ai besoin de soutien deux référence des types et des types de valeur.

  • C# supporte maintenant Null Opérateurs Conditionnels, qui est syntatic de sucre pour le dernier exemple que vous donnez. Votre code pourrait devenir if (myArgument?.Equals( default(T) ) != null ).
  • Cela ne fonctionne pas pour les types de valeur, c'est à dire évalue à true en tout cas, car Equals va toujours être appelé pour les types de valeur depuis myArgument ne peut pas être null dans ce cas et le résultat de Equals (un booléen) ne sera jamais null.
  • Tout aussi précieux, presque en double (donc pas de vote pour fermer): vous ne Pouvez pas l'opérateur == être appliquée à des types génériques en C#?
InformationsquelleAutor Stefan Moser | 2008-09-15