web-dev-qa-db-fra.com

Comment convertir C # nullable int en int

Comment convertir un int nullable en un int? Supposons que j'ai 2 types d'int comme ci-dessous:

int? v1;  
int v2; 

Je veux affecter la valeur de v1 à v2. v2 = v1; provoquera une erreur. Comment convertir v1 en v2?

431
KentZhou

Les autres réponses à ce jour sont toutes correctes. Je voulais juste en ajouter un de plus légèrement plus propre:

v2 = v1 ?? default(int);

N'importe quel Nullable<T> est implicitement convertible en son T, FOURNI que l'expression entière en cours d'évaluation ne peut jamais aboutir à une affectation nulle à un ValueType. Ainsi, l'opérateur ?? à coalescence nulle n'est que le sucre syntaxique pour l'opérateur ternaire:

v2 = v1 == null ? default(int) : v1;

... qui est à son tour une syntaxe sucre pour un if/else:

if(v1==null)
   v2 = default(int);
else
   v2 = v1;

De plus, à partir de .NET 4.0, Nullable<T> a une méthode "GetValueOrDefault ()", qui est un programme de lecture null-safe qui exécute fondamentalement la fusion nulle indiquée ci-dessus, donc cela fonctionne aussi:

v2 = v1.GetValueOrDefault();
579
KeithS

Comme ça,

if(v1.HasValue)
   v2=v1.Value

Vous pouvez utiliser la propriété Value pour l'affectation.

v2 = v1.Value;
82
e36M3

Tout ce dont tu as besoin c'est..

v2= v1.GetValueOrDefault();
73
thestar

Si vous savez que v1 a une valeur, vous pouvez utiliser la propriété Value:

v2 = v1.Value;

L'utilisation de la méthode GetValueOrDefault affectera la valeur s'il en existe une, sinon la valeur par défaut pour le type ou une valeur par défaut que vous spécifiez:

v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value

v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

Vous pouvez utiliser la propriété HasValue pour vérifier si v1 a une valeur:

if (v1.HasValue) {
  v2 = v1.Value;
}

Il existe également un support linguistique pour la méthode GetValueOrDefault(T):

v2 = v1 ?? -1;
46
Guffa

Vous ne pouvez pas le faire si v1 est null, mais vous pouvez vérifier avec un opérateur.

v2 = v1 ?? 0;
43
Arturo Martinez

GetValueOrDefault()

récupère la valeur de l'objet. S'il est null, il retourne la valeur par défaut de int, qui est 0.

Exemple:

v2= v1.GetValueOrDefault();

27
Aniket Sharma

La conversion int nullable en int peut se faire de la manière suivante:

v2=(int)v1;
12

En ce qui me concerne, la meilleure solution consiste à utiliser la méthode GetValueOrDefault().

v2 = v1.GetValueOrDefault();
12

Si la valeur par défaut pour un type donné est un résultat acceptable:

if (v1.HasValue)
    v2 = v1.GetValueOrDefault();

Si vous souhaitez une valeur par défaut différente lorsque le résultat est indéfini:

v2 = v1.GetValueOrDefault(255);    // or any valid value for int in place of 255

Si vous voulez juste que la valeur soit renvoyée (peu importe si la méthode a échoué ou non):

v2 = v1.GetValueOrDefault();


. NET 4.7.2.: GetValueOrDefault() renvoie la valeur du champ sans vérification.

11
GrzegorzF

c'est possible avec v2 = Convert.ToInt32(v1);

11
Rev

Une simple conversion entre v1 et v2 n'est pas possible car v1 a un domaine de valeurs plus grand que v2. Tout ce que v1 peut contenir, ainsi que l'état null. Pour convertir, vous devez indiquer explicitement quelle valeur dans int sera utilisée pour mapper l'état null. Le moyen le plus simple de faire cela est l'opérateur ??

v2 = v1 ?? 0;  // maps null of v1 to 0

Cela peut aussi être fait sous forme longue

int v2;
if (v1.HasValue) {
  v2 = v1.Value;
} else {
  v2 = 0;
}
9
JaredPar

Vous pourriez faire

v2 = v1.HasValue ? v1.Value : v2;
9
FIre Panda

Selon votre contexte d'utilisation, vous pouvez utiliser la fonctionnalité de correspondance de modèle de C # 7:

int? v1 = 100;
if (v1 is int v2)
{
    Console.WriteLine($"I'm not nullable anymore: {v2}");
}

MODIFIER:

Étant donné que certaines personnes votent à la baisse sans laisser d'explication, j'aimerais ajouter quelques détails pour expliquer la raison de l'inclure comme solution viable.

  • La correspondance de modèle de C # 7 nous permet maintenant de vérifier le type d'une valeur et de la convertir de manière implicite. Dans l'extrait de code ci-dessus, la condition if n'est transmise que lorsque la valeur stockée dans v1 est compatible avec le type du type pour v2, qui dans ce cas est int. Il en résulte que lorsque la valeur de v1 est null, la condition if échouera, car null ne peut pas être affecté à un int. Plus exactement, null n'est pas un int.

  • Je tiens à souligner que cette solution peut ne pas toujours être le choix optimal. Comme je le suggère, je pense que cela dépendra du contexte d'utilisation exact du développeur. Si vous avez déjà un int? et que vous souhaitez appliquer sa valeur de manière conditionnelle , if-and-only-if , la valeur affectée n'est pas nulle (c'est la seule fois est sûr de convertir un int nullable en un int régulier sans perdre d’informations), la correspondance de motif est peut-être l’un des moyens les plus concis de le faire.

7
Nick Miller

Il affectera la valeur de v1 à v2 s'il n'est pas nul, sinon il prendra une valeur par défaut égale à zéro.

v2=v1??0

Ou ci-dessous est l'autre façon de l'écrire.

v2 = v1.HasValue?v1:0
2
sagar