2012-04-27 20 views

Respuesta

139

Hay 2 sobrecargas de ToString que entran en juego aquí

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

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

En el null as object ha solidificado el tipo de la expresión como object. Esto significa que ya no es compatible con la sobrecarga string y el compilador elige la sobrecarga object ya que es la única 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#.

+15

Ok. Entonces está usando una sobrecarga en lugar de la otra. Tiene sentido. Pero, ¿no deberían ambas sobrecargas devolver lo mismo? +1 por cierto. –

+2

@JohnMacIntyre - Eso depende del equipo de desarrollo, no del compilador. – JonH

+0

+1 Gran explicación. – JonH

61

siguiendo de JaredPar's excellent overload resolution respuesta - la pregunta sigue siendo "¿por qué Convert.ToString(string) devuelve nulo, pero Convert.ToString(object) return string.Empty"?

Y la respuesta a eso es ... porque dicen the docsso:

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

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

EDIT: En cuanto a si se trata de un "error en la especificación", "muy mal diseño de la API", "¿Por qué se especifica como esto", etc. - me quedo con un tiro en un razonamiento de base por eso no lo veo como un gran problema.

  1. System.Convert tiene métodos para la conversión de cada tipo de base a . 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) se 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 pasó null. Lanzar, devolver nulo o devolver 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 trata sobre 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 de "no 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).
+0

¿Es justo decir que es un error en la especificación? –

+3

que no responde por qué es así. Decir que se comporta así porque está documentado comportarse así es tautológico. – CodesInChaos

+2

@JohnMacIntyre IMO es justo decir que es un diseño API muy malo. – CodesInChaos

Cuestiones relacionadas