Convert.ToString(null)
devoluciones
null
Como yo esperaba.
Pero
Convert.ToString(null as object)
devoluciones
""
¿Por qué son diferentes?
Hay 2 sobrecargas ToStringque 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 nullvalor es convertible a cualquier tipo de referencia. En este caso stringes más específico que objecty 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 stringsobrecarga y el compilador elige la objectsobrecarga, 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)oSiguiendo 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.Converttiene 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.Convertocupa de tipos de valor, que tienen un valor predeterminado.Convert.ToString(string)significa romper la regla de "sin conversión real". Dado queSystem.Convertes 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