Convert.ToString(null)
vuelve¿Por qué Convert.ToString (null) devuelve un valor diferente si arroja nulo?
null
como lo esperaba.
Pero
Convert.ToString(null as object)
vuelve
""
¿Por qué son estos diferentes?
Convert.ToString(null)
vuelve¿Por qué Convert.ToString (null) devuelve un valor diferente si arroja nulo?
null
como lo esperaba.
Pero
Convert.ToString(null as object)
vuelve
""
¿Por qué son estos diferentes?
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#.
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.
System.Convert
tiene métodos para la conversión de cada tipo de base a sí. 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.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.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).¿Es justo decir que es un error en la especificación? –
que no responde por qué es así. Decir que se comporta así porque está documentado comportarse así es tautológico. – CodesInChaos
@JohnMacIntyre IMO es justo decir que es un diseño API muy malo. – CodesInChaos
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. –
@JohnMacIntyre - Eso depende del equipo de desarrollo, no del compilador. – JonH
+1 Gran explicación. – JonH