69 votes

Pourquoi .ToString () sur une chaîne NULL provoque-t-il une erreur NULL, alors que .ToString () fonctionne correctement sur un int nullable avec une valeur null?

selectedItem a deux champs:

  • int? _cost
  • chaîne _serialNumber

Dans cet exemple, _cost et _serialNumber de selectedItem sont tous DEUX nuls. Je suis de la lecture à travers les champs de selectedItem par l'intermédiaire de leurs propriétés, et de remplissage dans les zones de texte avec leurs valeurs, quand...

TextBox1.Text = selectedItem.Cost.ToString(); //no error
TextBox2.Text = selectedItem.SerialNumber.ToString(); //error

Je comprends que SerialNumber.ToString() est redondant (parce que c'est déjà une chaîne de caractères), mais je ne comprends pas pourquoi cela provoque un "Nullable objet doit avoir une valeur de" l'exception".

  • int? _cost est nullable, et n'a pas une valeur, mais il ne me donne pas l'exception.
  • string _serialNumber est nullable, et n'a pas une valeur, mais il ne me donner l'exception.

Cette question touche à ça, le gars est en substance la même chose, mais il n'est pas désigné, répondre, et elle n'explique pas pourquoi nullable int? Par exemple, je peux utiliser .ToString() sur un nullable int mais pas sur une chaîne nulle?

89voto

Johnny_D Points 2590

Parce qu' string type null vraiment des points pour rien, il n'y a aucun objet dans la mémoire.
Mais int? type(nullable), même avec la valeur fixée null des points encore à un objet.
Si vous lisez Jeffrey Richter "CLR via C#", vous verrez que type nullable sont juste à la façade classes de types communs avec certains incapsulated logiques afin de rendre le travail avec DB null plus pratique.

Vérifier msdn pour en apprendre davantage sur les types nullables.

32voto

Hans Kesting Points 17043

Un Nullable<int> est un struct et ne peut pas être vraiment nul. Donc, un appel de méthode sur une structure "null" fonctionne toujours.

Il existe une "magie du compilateur" qui fait de _cost == null une expression valide.

14voto

Asif Mushtaq Points 7943

int? n'est pas réellement un objet dans son propre, mais c'est un Nullable<int> objet.

Lorsque vous déclarez int? _Cost, vous êtes en fait en déclarant Nullable<int> _Cost et la propriété de l' _Cost.Value est undefined pas _Cost objet lui-même.

Il est en fait un sucre syntaxique pour utiliser non nullable type int, bool ou decimal facilement.

Selon MSDN:

La syntaxe T? est une abréviation pour le Système.Nullable, où T est un type valeur. Les deux formes sont interchangeables.

4voto

Tom Highfield Points 55

Une chaîne est un type de référence, mais un int nullable est un type de valeur. Voici une bonne discussion sur les différences http://www.albahari.com/valuevsreftypes.aspx .

2voto

Nullable est en réalité une structure qui expose deux propriétés: HasValue et Value. Si vous faites cela, vous aurez votre erreur:

 int? i = null;
i.Value.ToString()
 

Afin de vérifier si votre int? a une valeur à laquelle vous pouvez accéder i.HasValue

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X