System.Nullable Quelle est la valeur de null * Valeur int?
-
19-09-2019 - |
Question
Considérez les énoncés suivants:
int? v1 = null;
int? v2 = 5 * v1;
Quelle est la valeur de v2
? (null
ou chaîne vide?)
Comment puis-je empêcher le compilateur pour marquer l'opération comme non valide? Ai-je besoin de suivre la gestion des exceptions personnalisée?
La solution
Il est null
.
C # Language Specification 3.0 (Section §7.2.7: opérateurs Lifted)
Pour les opérateurs binaires
+
-
*
/
%
&
|
^
<<
>>
:une forme soulevée d'un opérateur existe si les types d'opérande et résultat sont tous les types de valeur non nulle. La forme levée est réalisée en ajoutant un modificateur de
?
à chaque type d'opérande et résultat. L'opérateur soulevé produit une valeur denull
si un ou les deux opérandes sontnull
(une exception étant les opérateurs de&
et|
du typebool?
, comme décrit dans §7.10.3). Dans le cas contraire, l'opérateur soulevé déballe les opérandes, applique l'opérateur sous-jacent, et enveloppe le résultat.
Comment puis-je empêcher le compilateur pour marquer l'opération comme non valide? Ai-je besoin de suivre la gestion des exceptions personnalisée?
Il est pas une opération non valide. Il ne sera pas jeter une exception si vous ne avez pas besoin de gérer les exceptions dans ce cas.
Autres conseils
Si vous voulez que l'opération soit empêchée par le compilateur, faire la deuxième variable non annulable. Ensuite, vous serez obligé d'écrire:
int v2 = 5 * v1.Value;
Cela jette une exception au moment de l'exécution si v1 est nulle.
Sa valeur sera « nulle », dans ce contexte, au moins peut être considéré comme identique à une base de données null, à savoir plutôt que rien, ou zéro, cela signifie « inconnu ». Cinq beaucoup d'inconnu est encore inconnu, ce sera également jamais « chaîne vide » que vous avez affaire à des chiffres, et non des chaînes.
Je ne sais pas ce que vous entendez par « Comment puis-je empêcher le compilateur pour le marquer comme non valide l'opération? » que ce code compile et fonctionne bien pour moi sous Visual Studio 2008 =)
Je ne sais pas ce que vous essayez de faire, mais si vous voulez v2 à NULL si v1 est alors nul que vous devriez vérifier si v1 a une valeur avant de l'utiliser.
int? v2 = v1.HasValue ? 5 * v1.Value : null;
ou
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }