Convert.ToString(null)
Retour
null
Comme je l'attendais.
Mais
Convert.ToString(null as object)
Retour
""
Pourquoi sont-ils différents?
Convert.ToString(null)
Retour
null
Comme je l'attendais.
Mais
Convert.ToString(null as object)
Retour
""
Pourquoi sont-ils différents?
Réponses:
Il y a 2 surcharges ToStringqui entrent en jeu ici
Convert.ToString(object o);
Convert.ToString(string s);
Le compilateur C # essaie essentiellement de choisir la surcharge la plus spécifique qui fonctionnera avec l'entrée. Une nullvaleur est convertible en n'importe quel type de référence. Dans ce cas, il stringest plus spécifique que objectet par conséquent, il sera choisi comme gagnant.
Dans le, null as objectvous avez solidifié le type de l'expression en tant que object. Cela signifie qu'il n'est plus compatible avec la stringsurcharge et que le compilateur sélectionne la objectsurcharge car c'est la seule compatible qui reste.
Les détails vraiment épineux du fonctionnement de cette rupture de cravate sont traités dans la section 7.4.3 de la spécification du langage C #.
Convert.ToString(string)c'est juste une fonction d'identité alors Convert.ToString(object)qu'il passe par un chemin plus difficile à suivre. En un coup d'œil, je serais d'accord pour dire qu'ils devraient retourner la même chose, mais la couche convertible de la BCL n'est pas quelque chose que je connais très bien et il est possible qu'il y ait une bonne raison à la différence (je suis sceptique cependant)
(string)null, ou si votre objection s'appelle o, alors(string)o
Suite à l'excellente réponse de résolution de surcharge de JaredPar - la question reste "pourquoi Convert.ToString(string)retourne null, mais Convert.ToString(object)retourne string.Empty"?
Et la réponse est ... parce que les documents disent donc :
Convert.ToString (string) renvoie "l'instance de chaîne spécifiée; aucune conversion réelle n'est effectuée."
Convert.ToString (object) renvoie «la représentation sous forme de chaîne de valeur, ou String.Empty si value est null».
EDIT: Quant à savoir s'il s'agit d'un "bogue dans la spécification", "très mauvaise conception d'API", "pourquoi a-t-il été spécifié comme ça", etc. - Je vais essayer de trouver une raison pour laquelle je ne vois pas c'est un gros problème.
System.Converta des méthodes pour convertir chaque type de base en lui-même . C'est étrange - puisqu'aucune conversion n'est nécessaire ou possible, les méthodes finissent par renvoyer simplement le paramètre. Convert.ToString(string)se comporte de la même manière. Je suppose que ce sont là pour les scénarios de génération de code.Convert.ToString(object)a 3 choix une fois passé null. Lance, renvoie null ou renvoie une chaîne. Lancer serait mauvais - doublement avec l'hypothèse qu'ils sont utilisés pour le code généré. Le retour de null nécessite que votre appelant fasse une vérification de null - encore une fois, ce n'est pas un excellent choix dans le code généré. Renvoyer la chaîne. Vide semble un choix raisonnable. Le reste System.Converttraite des types de valeur - qui ont une valeur par défaut.Convert.ToString(string)signifie enfreindre la règle "pas de conversion réelle". Puisqu'il System.Converts'agit d'une classe d'utilité statique, chaque méthode peut être logiquement traitée comme la sienne. Il y a très peu de scénarios du monde réel où ce comportement devrait être "surprenant", laissez donc l'utilisabilité l'emporter sur la (possible) correction.