Apparemment Nullable<int>
et int?
sont équivalents en valeur. Y a-t-il des raisons de choisir l'un plutôt que l'autre?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
Aucune différence.
int?
est juste un raccourci pour Nullable<int>
, qui lui-même est un raccourci pour Nullable<Int32>
.
Le code compilé sera exactement le même quel que soit celui que vous choisissez d'utiliser.
Le
?
formulaire n'est qu'un raccourci pour le type complet. La préférence personnelle est la seule raison de choisir l'un plutôt que l'autre.Détails complets ici .
la source
Bien que je sois tout à fait d'accord pour dire que dans la plupart des cas, ils sont identiques, je suis récemment tombé sur une situation où il y a une différence entre les deux. Pour les détails sanglants, voyez cette question , mais pour vous donner un exemple rapide ici:
La première ligne donne les messages d'erreur suivants:
Si vous êtes curieux de connaître la raison exacte de cela, je vous recommande vraiment de vérifier la question déjà liée , mais le problème de base est que dans la phase d'analyse après un
is
(ou unas
) opérateur, lorsque nous sommes confrontés à un?
jeton, nous vérifions si le suivant le jeton peut être interprété comme un opérateur unaire (&
pourrait en être un) et si c'est le cas: l'analyseur ne se soucie pas de la possibilité que le?
jeton soit un modificateur de type, il utilise simplement le type avant lui et analysera le reste comme si le?
token était un opérateur ternaire (ainsi l'analyse échouera).Ainsi, bien qu'en général
int?
et qu'ilsNullable<int>
soient interchangeables, il y a des cas secondaires où ils produisent des résultats complètement différents, en raison de la façon dont l'analyseur voit votre code.la source
test
,, est fixé avec une parenthèse, doncvar test = (a is int?) & b;
. Peut également être fixé avecvar test = a is int? && b;
, et étant donné queb
est un paramètre de valeur simple (pas d'effets secondaires sur l' évaluation) , il semble étrange de préférer&
plus&&
.?
est un caractère clé.int?
comme une opération ternaire (var test = a is int? <return if true> : <return if false>
), pas comme un int nullable.bool
surcharges particulières . Ce sont des opérateurs logiques booléens (le&
forbool
) et des opérateurs logiques conditionnels booléens (le&&
forbool
). Notez comment la première de ces sous-sections est clairement nommée logique . N'oubliez pas qu'en C #, il n'y a pas de conversions ("casts") entrebool
les types numériques et!Il y a apparemment une différence entre les deux lors de l'utilisation de la génération Entity Framework (EF) avec code first:
Lorsque votre entité contient une propriété déclarée comme:
EF ne générera pas de propriété nullable et vous devrez forcer le générateur à le rendre nullable comme ceci:
D'autre part, si vous déclarez votre entité comme:
le générateur EF générera une propriété Nullable avec un champ Nullable dans la table de base de données correspondante.
la source
Nullable
définition quelque part, car avec la fonction intégréeNullable<T>
, il n'est pas possible pour EF de voir la différence entre les deux. Même si les gens d'EF voulaient les traiter différemment, ils ne le pouvaient pas.Nullable est un type générique, mais int? n'est pas.
Il existe certains scénarios où Nullable doit être utilisé sur int?
par exemple: ici vous ne pouvez pas remplacer Nullable par int?
comment pouvez-vous changer le code ci-dessous sans utiliser Nullable ?
la source
Nullable<T>
lui estNullable<int>