Comment convertir le C# nullable int int
Comment puis-je convertir des nullable int
à un int
? Supposons que j'ai 2 type de int en tant que ci-dessous:
int? v1;
int v2;
Je veux attribuer v1
's de la valeur à v2
. v2 = v1;
provoquera une erreur. Comment puis-je convertir des v1
à v2
?
Vous devez vous connecter pour publier un commentaire.
Les autres réponses sont tout à fait correct; je voulais juste ajouter un peu de nettoyant:
Tout
Nullable<T>
est implicitement convertible sonT
, à la CONDITION que l'expression soit évaluée ne peut jamais résulter en une valeur null à l'affectation à un ValueType. Ainsi, le null-coalescence de l'opérateur??
est juste la syntaxe de sucre pour l'opérateur ternaire:...qui est à son tour de la syntaxe de sucre pour un if/else:
Aussi, comme de .NET 4.0,
Nullable<T>
a un "GetValueOrDefault()" la méthode, qui est un null-safe getter que, fondamentalement, effectue les nuls-la coalescence indiqué ci-dessus, de sorte que cela fonctionne aussi:default(int)
vraiment nécessaire? Quel est le problème avec un simple0
?default
le cas échéant. Zéro n'est pas toujours valide en tant que valeur, beaucoup moins la valeur par défaut, donc si vous remplacezint
avec un génériqueT
vous trouverez mon code fonctionne alors que nul ne l'est pas. Dans un avenir framework version,default
peuvent aussi devenir overloadable; si et quand cela arrive, le code à l'aide de la valeur par défaut sera facilement en mesure de profiter, tout en explicite la valeur null ou zéro affectations devront être modifiées.Comme ça,
Vous pouvez utiliser la propriété Value de cession.
v1.HasValue
premier.v1
estnull
. À mon avis, ce n'est pas une réponse correcte.Tous vous avez besoin est..
Si vous savez que
v1
a une valeur, vous pouvez utiliser leValue
propriété:À l'aide de la
GetValueOrDefault
méthode affectez la valeur si il y en a un, sinon la valeur par défaut pour le type, ou une valeur par défaut que vous indiquez:Vous pouvez utiliser le
HasValue
propriété pour vérifier siv1
a une valeur:Il est également le support de la langue pour la
GetValueOrDefault(T)
méthode:Vous ne pouvez pas le faire si v1 est nulle, mais vous pouvez vérifier avec un opérateur.
récupère la valeur de l'objet. Si elle est nulle, elle renvoie la valeur par défaut de type int , qui est 0.
Exemple:
Int nullable à l'int de la conversion peut être fait comme suit:
c'est possible avec
v2 = Convert.ToInt32(v1);
Autant que je suis concerné, la meilleure solution est d'utiliser
GetValueOrDefault()
méthode.Si la valeur par défaut pour un type donné est un résultat acceptable:
Si vous souhaitez une autre valeur par défaut lorsque le résultat n'est pas défini:
Si vous voulez juste la valeur retournée (peu importe si la méthode a échoué ou pas):
.NET 4.7.2.: .GetValueOrDefault()">
GetValueOrDefault()
retourne la valeur du champ sans aucune vérification.Vous pourriez faire
Une simple conversion entre
v1
etv2
n'est pas possible parce quev1
a un domaine plus vaste de valeurs quev2
. C'est toutv1
peut contenir en plus de lanull
état. Pour convertir, vous devez explicitement la valeur qu'enint
sera utilisé pour cartographier lesnull
état. Le moyen le plus simple pour ce faire est la??
opérateurCela peut aussi être fait en forme longue
En fonction de votre utilisation, vous pouvez utiliser le C# 7 du pattern-matching fonctionnalité:
EDIT:
Puisque certaines personnes sont downvoting sans laisser d'explication, je tiens à ajouter quelques détails pour expliquer le bien-fondé de l'inclusion de cette comme une solution viable.
C# 7 du pattern matching nous permet aujourd'hui de vérifier le type d'une valeur, et de le jeter implicitement. Dans l'extrait ci-dessus, si la condition ne passe lorsque la valeur stockée dans
v1
est de type compatible avec le type dev2
, qui dans ce cas estint
. Il en résulte que, lorsque la valeur dev1
estnull
, si la condition échoue, car nul ne peut être attribué à unint
. Plus correctement,null
n'est pas unint
.Je tiens à souligner que la que cette solution peut ne pas toujours être le choix optimal. Comme je le suggère, je crois que cela dépendra de ce que le développeur d'utilisation précises contexte. Si vous avez déjà un
int?
et souhaitez conditionnellement fonctionner sur sa valeur si-et-seulement-si la valeur assignée n'est pas null (c'est le seul moment où il est sûr de convertir un nullable int vers un int, sans perte d'information), puis le pattern matching est peut-être le plus concis de façons de le faire.if (v1 is int v2)
ne semble pas juste pour moi...HasValue
contrôles.Il va affecter la valeur de
v1
àv2
si elle n'est pas null, sinon il va prendre une valeur par défaut à zéro.Ou ci-dessous est l'autre façon de l'écrire.