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?

Était-ce utile?

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 de null si un ou les deux opérandes sont null (une exception étant les opérateurs de & et | du type bool?, 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; }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top