47 votes

Comment un objet peut-il ne pas être comparé à null ?

J'ai un paramètre "optionnel" dans une méthode qui est une paire clé-valeur. Je voulais une surcharge qui passe null à la méthode principale pour ce paramètre, mais dans la méthode principale, lorsque je veux vérifier si la KeyValuePair est null, j'obtiens l'erreur suivante :

Operator '!=' cannot be applied to operands of type System.Collections.Generic.KeyValuePair<string,object>' and '<null>. 

Comment puis-je ne pas être autorisé à vérifier si un objet est nul ?

80voto

Jon Skeet Points 692016

KeyValuePair<K,V> est une structure, pas une classe. C'est comme faire :

int i = 10;
if (i != null) ...

(Bien que cela soit en fait légal, avec un avertissement, en raison des règles bizarres de conversion des nullités. Ce qui est important, c'est que l'élément if ne sera jamais vraie).

Pour le rendre "facultatif", vous pouvez utiliser la forme nullable :

static void Foo(KeyValuePair<object,string>? pair)
{
    if (pair != null)
    {
    }
    // Other code
}

Notez le ? dans KeyValuePair<object,string>?

13voto

eudaimos Points 460

Je réponds à cette question malgré son ancienneté car c'est le premier résultat de Google pour "test keyvaluepair to null"

La réponse indiquée est correcte, mais elle ne répond pas complètement au problème, du moins à celui que je rencontrais, où je devais tester l'existence de l'élément KeyValuePair et de passer à un autre contrôle de la Dictionary s'il n'existe pas de la manière dont je m'y attends.

L'utilisation de la méthode ci-dessus n'a pas fonctionné pour moi car le compilateur s'étouffe lorsqu'il obtient KeyValuePair.Value de KeyValuePair<>? Il est donc préférable d'utiliser default(KeyValuePair<>) comme le montre cette question et ses réponses. Valeur par défaut pour KeyValuePair

6voto

AnthonyWJones Points 122520

Comme KeyValuePair est une structure (un type de valeur), vous ne pouvez comparer que des valeurs nulles sur des types de référence.

Je suppose que vous n'avez pas encore écrit cette surcharge supplémentaire. Elle échouera si vous tentez de passer null comme valeur d'une paire clé-valeur.

3voto

JaredPar Points 333733

KeyValuePair<K,V> est une structure et ne peut donc en aucun cas être nulle. Seul un type de référence peut être nul.

Si vous essayez de détecter une valeur incorrecte, vous devrez valider les membres Key et Value individuellement.

-9voto

Jeremy Points 1

Vous pouvez en fait utiliser KeyValuePair.IsNull() pour déterminer si la KeyValuePair a été définie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X