Convert.ToString(null)
devoluciones
null
Como yo esperaba.
Pero
Convert.ToString(null as object)
devoluciones
""
¿Por qué son diferentes?
Hay 2 sobrecargas ToString
que entran en juego aquí.
Convert.ToString(object o);
Convert.ToString(string s);
El compilador de C # esencialmente intenta elegir la sobrecarga más específica que funcionará con la entrada. Un null
valor es convertible a cualquier tipo de referencia. En este caso string
es más específico que object
y por lo tanto será elegido como ganador.
En el null as object
, ha solidificado el tipo de expresión como object
. Esto significa que ya no es compatible con la string
sobrecarga y el compilador elige la object
sobrecarga, ya que es el único compatible que queda.
Los detalles realmente complicados de cómo funciona este desempate se tratan en la sección 7.4.3 de la especificación del lenguaje C #.
Convert.ToString(string)
es solo una función de identidad, mientras que enConvert.ToString(object)
realidad pasa por un camino más difícil de seguir. De un vistazo, estaría de acuerdo en que deberían devolver lo mismo, pero la capa convertible del BCL no es algo en lo que tenga mucho conocimiento y es posible que haya una buena razón para la diferencia (aunque soy escéptico)(string)null
, o si su objeción se llama o, entonces(string)o
Siguiendo con la excelente respuesta de resolución de sobrecarga de JaredPar, la pregunta sigue siendo "¿por qué
Convert.ToString(string)
devuelve nulo, peroConvert.ToString(object)
vuelvestring.Empty
"?Y la respuesta a eso es ... porque los documentos dicen así :
EDITAR: En cuanto a si se trata de un "error en la especificación", "muy mal diseño de API", "por qué se especificó así", etc., intentaré explicar por qué no veo es tan importante.
System.Convert
tiene métodos para convertir cada tipo base a sí mismo . Esto es extraño, ya que no se necesita ni es posible una conversión, por lo que los métodos terminan devolviendo el parámetro.Convert.ToString(string)
se comporta igual. Supongo que están aquí para escenarios de generación de código.Convert.ToString(object)
tiene 3 opciones cuando se apruebanull
. Lanzar, devolver nulo o devolver cadena. Lanzar sería malo, doblemente si se supone que se utilizan para el código generado. Devolver nulo requiere que la persona que llama haga una verificación de nulo; de nuevo, no es una gran elección en el código generado. Devolución de cadena Vacío parece una opción razonable. El resto seSystem.Convert
ocupa de tipos de valor, que tienen un valor predeterminado.Convert.ToString(string)
significa romper la regla de "sin conversión real". Dado queSystem.Convert
es una clase de utilidad estática, cada método puede tratarse lógicamente como propio. Hay muy pocos escenarios del mundo real donde este comportamiento debería ser "sorprendente", así que deje que la usabilidad gane sobre la (posible) corrección.fuente