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.
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;
}
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.