c# .net

c# - ¿Por qué Convert.ToString(null) devuelve un valor diferente si arroja nulo?



.net (2)

Hay dos sobrecargas de ToString que entran en juego aquí

Convert.ToString(object o); Convert.ToString(string s);

El compilador C # esencialmente trata de elegir la sobrecarga más específica que funcionará con la entrada. Un valor null es convertible a cualquier tipo de referencia. En este caso, la string es más específica que el object y, por lo tanto, se elegirá como ganadora.

En el null as object , has solidificado el tipo de expresión como object . Esto significa que ya no es compatible con la sobrecarga de string y el compilador selecciona la sobrecarga del object ya que es el único compatible que queda.

Los detalles realmente peludos de cómo funciona este desempate se tratan en la sección 7.4.3 de la especificación del lenguaje C #.

Convert.ToString(null)

devoluciones

null

Como yo esperaba.

Pero

Convert.ToString(null as object)

devoluciones

""

¿Por qué son diferentes?


Siguiendo con la excelente respuesta de resolución de sobrecarga de JaredPar, la pregunta sigue siendo "¿por qué Convert.ToString(string) devuelve null, pero Convert.ToString(object) return string.Empty "?

Y la respuesta a eso es ... porque los documentos lo dicen so :

Convert.ToString (cadena) devuelve "la instancia de cadena especificada, no se realiza ninguna conversión real".

Convert.ToString (object) devuelve "la representación de cadena de valor, o String.Empty si el valor es nulo".

EDITAR: en cuanto a si esto es un "error en la especificación", "muy mal diseño de la API", "por qué se especificó así", etc. - Voy a echar un vistazo a algunos motivos de por qué no veo es tan importante.

  1. System.Convert tiene métodos para convertir cada tipo de base a sí mismo . Esto es extraño, ya que no es necesaria ni posible la conversión, por lo que los métodos terminan simplemente devolviendo el parámetro. Convert.ToString(string) comporta de la misma manera. Supongo que estos están aquí para los escenarios de generación de código.
  2. Convert.ToString(object) tiene 3 opciones cuando pasa null . Lanzar, devolver nulo o devolver la cadena. Vacío. Lanzar sería malo, doblemente con la suposición de que se usan para el código generado. La devolución nula requiere que la persona que llama haga una comprobación nula; de nuevo, no es una gran elección en el código generado. Volviendo string.Empty parece una elección razonable. El resto de System.Convert ocupa de los tipos de valores, que tienen un valor predeterminado.
  3. Es discutible si devolver null es más "correcto", pero string.Empty definitivamente es más útil. Cambiar Convert.ToString(string) significa romper la regla "sin conversión real". Como System.Convert es una clase de utilidad estática, cada método se puede tratar lógicamente como propio. Hay muy pocos escenarios del mundo real en los que este comportamiento sea "sorprendente", así que deje que la usabilidad se haga cargo de la corrección (posible).