web-dev-qa-db-fra.com

Comment fonctionne GetValueOrDefault?

Je suis responsable d'un fournisseur LINQ qui effectue une évaluation à l'exécution du code C #. Par exemple:

int? thing = null;
accessor.Product.Where(p => p.anInt == thing.GetValueOrDefault(-1))

Actuellement, le code ci-dessus ne fonctionne pas avec mon fournisseur LINQ car thing est null.

Bien que je travaille avec C # depuis longtemps, je ne sais pas comment GetValueOrDefault est implémenté et donc comment résoudre ce problème.

Ma question est donc la suivante: comment fonctionne GetValueOrDefault dans le cas où l'instance sur laquelle elle s'appelle est nulle? Pourquoi une NullReferenceException n'est-elle pas lancée?

Une question suivante: comment dois-je répliquer un appel à GetValueOrDefault en utilisant la réflexion, étant donné que je dois gérer des valeurs nulles.

16
Ian Newson

thing n'est pas null. Puisque les structures ne peuvent pas être null, donc Nullable<int> ne peut pas être null.

Le problème, c’est… c’est juste la magie du compilateur. Vous pensez que c'est null. En fait, la HasValue est simplement définie sur false.

Si vous appelez GetValueOrDefault il vérifie si HasValue est true ou false:

public T GetValueOrDefault(T defaultValue)
{
    return HasValue ? value : defaultValue;
}
20
Patrick Hofman

Un NullReferenceException n'est pas jeté, car il n'y a pas de référence. La variable GetValueOrDefault est une méthode de la structure Nullable<T>. Son utilisation est donc un type valeur, pas un type référence.

La méthode GetValueOrDefault(T) est simplement implémentée comme ceci :

public T GetValueOrDefault(T defaultValue) {
    return HasValue ? value : defaultValue;
}

Donc, pour reproduire le comportement, il vous suffit de vérifier la propriété HasValue pour voir quelle valeur utiliser.

1
Guffa