Convert.ToString(null)
Retour
null
Comme je l'attendais.
Mais
Convert.ToString(null as object)
Retour
""
Pourquoi sont-ils différents?
Il y a 2 surcharges ToString
qui 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 null
valeur est convertible en n'importe quel type de référence. Dans ce cas, il string
est plus spécifique que object
et par conséquent, il sera choisi comme gagnant.
Dans le, null as object
vous avez solidifié le type de l'expression en tant que object
. Cela signifie qu'il n'est plus compatible avec la string
surcharge et que le compilateur sélectionne la object
surcharge 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é alorsConvert.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, maisConvert.ToString(object)
retournestring.Empty
"?Et la réponse est ... parce que les documents disent donc :
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.Convert
a 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 resteSystem.Convert
traite 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'ilSystem.Convert
s'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.la source