Convert.ToString(null)
retorna
null
Como eu esperava.
Mas
Convert.ToString(null as object)
retorna
""
Por que são diferentes?
Convert.ToString(null)
retorna
null
Como eu esperava.
Mas
Convert.ToString(null as object)
retorna
""
Por que são diferentes?
Respostas:
Existem 2 sobrecargas ToString
que entram em jogo aqui
Convert.ToString(object o);
Convert.ToString(string s);
O compilador C # tenta essencialmente escolher a sobrecarga mais específica que funcionará com a entrada. Um null
valor pode ser convertido em qualquer tipo de referência. Neste caso, string
é mais específico do que object
e, portanto, será escolhido como o vencedor.
No null as object
você solidificou o tipo da expressão como object
. Isso significa que ele não é mais compatível com a string
sobrecarga e o compilador escolhe a object
sobrecarga, pois é o único compatível restante.
Os detalhes realmente complicados de como essa quebra de empate funciona são abordados na seção 7.4.3 das especificações da linguagem C #.
Convert.ToString(string)
dela, é apenas uma função de identidade enquanto, Convert.ToString(object)
na verdade, segue um caminho mais difícil de seguir. À primeira vista, eu concordaria que eles deveriam retornar o mesmo, mas a camada conversível do BCL não é algo que eu tenho muito conhecimento e é possível que haja uma boa razão para a diferença (embora eu seja cético)
(string)null
, ou se você (string)o
Seguindo a excelente resposta de resolução de sobrecarga de JaredPar - a pergunta permanece "por que Convert.ToString(string)
retorna nulo, mas Convert.ToString(object)
retorna string.Empty
"?
E a resposta para isso é ... porque os docs dizem assim :
Convert.ToString (string) retorna "a instância de string especificada; nenhuma conversão real é realizada."
Convert.ToString (object) retorna "a representação de string do valor, ou String.Empty se o valor for nulo."
EDITAR: sobre se isso é um "bug na especificação", "design de API muito ruim", "por que foi especificado assim", etc. - Vou tentar explicar por que não vejo é tão grande coisa.
System.Convert
possui métodos para converter cada tipo de base em si mesmo . Isso é estranho - já que nenhuma conversão é necessária ou possível, então os métodos acabam retornando apenas o parâmetro. Convert.ToString(string)
se comporta da mesma forma. Presumo que estejam aqui para cenários de geração de código.Convert.ToString(object)
tem 3 opções quando aprovado null
. Lançar, retornar nulo ou retornar string.Empty. Jogar seria ruim - duplamente com a suposição de que são usados para código gerado. Retornar nulo exige que seu chamador faça uma verificação de nulo - novamente, não é uma ótima escolha no código gerado. Retornar string.Empty parece uma escolha razoável. O resto System.Convert
lida com tipos de valor - que têm um valor padrão.Convert.ToString(string)
significa quebrar a regra de "nenhuma conversão real". Como System.Convert
é uma classe de utilitário estático, cada método pode ser tratado logicamente como seu. Existem muito poucos cenários do mundo real onde esse comportamento deveria ser "surpreendente", então deixe a usabilidade vencer a (possível) correção.