Convert.ToString(null)
ritorna
null
Come mi aspettavo.
Ma
Convert.ToString(null as object)
ritorna
""
Perché sono diversi?
Convert.ToString(null)
ritorna
null
Come mi aspettavo.
Ma
Convert.ToString(null as object)
ritorna
""
Perché sono diversi?
Risposte:
Ci sono 2 sovraccarichi ToStringche entrano in gioco qui
Convert.ToString(object o);
Convert.ToString(string s);
Il compilatore C # tenta essenzialmente di scegliere l'overload più specifico che funzionerà con l'input. Un nullvalore è convertibile in qualsiasi tipo di riferimento. In questo caso stringè più specifico di objecte quindi verrà scelto come vincitore.
In null as objecthai consolidato il tipo di espressione come object. Ciò significa che non è più compatibile con l' stringoverload e il compilatore sceglie l' objectoverload poiché è l'unico compatibile rimanente.
I dettagli davvero complicati di come funziona questa interruzione del legame sono trattati nella sezione 7.4.3 delle specifiche del linguaggio C #.
Convert.ToString(string)questa è solo una funzione di identità mentre in Convert.ToString(object)realtà attraversa un percorso più difficile da seguire. A prima vista sarei d'accordo che dovrebbero restituire lo stesso, ma lo strato convertibile del BCL non è qualcosa su cui sono molto informato ed è possibile che ci sia una buona ragione per la differenza (sono scettico però)
(string)null, o se ti (string)o
In seguito all'eccellente risposta di JaredPar sulla risoluzione del sovraccarico , la domanda rimane "perché Convert.ToString(string)restituisce null, ma Convert.ToString(object)restituisce string.Empty"?
E la risposta è ... perché la documentazione dicono così :
Convert.ToString (stringa) restituisce "l'istanza di stringa specificata; non viene eseguita alcuna conversione effettiva".
Convert.ToString (object) restituisce "la rappresentazione di stringa di value o String.Empty se value è null".
EDIT: Per quanto riguarda se si tratta di un "bug nelle specifiche", "progettazione API pessima", "perché è stato specificato in questo modo", ecc. è un grosso problema.
System.Convertha metodi per convertire ogni tipo di base in se stesso . Questo è strano, poiché non è necessaria o possibile alcuna conversione, quindi i metodi finiscono per restituire solo il parametro. Convert.ToString(string)si comporta lo stesso. Presumo che siano qui per scenari di generazione di codice.Convert.ToString(object)ha 3 scelte una volta superato null. Genera, restituisce null o restituisce una stringa. Il lancio sarebbe dannoso, doppiamente supponendo che vengano utilizzati per il codice generato. La restituzione di null richiede che il chiamante esegua un controllo null: di nuovo, non è un'ottima scelta nel codice generato. Restituzione di una stringa Vuoto sembra una scelta ragionevole. Il resto si System.Convertoccupa di tipi di valore, che hanno un valore predefinito.Convert.ToString(string)significa infrangere la regola "nessuna conversione effettiva". Poiché System.Convertè una classe di utilità statica, ogni metodo può essere logicamente trattato come se fosse il suo. Ci sono pochissimi scenari del mondo reale in cui questo comportamento dovrebbe essere "sorprendente", quindi lascia che l'usabilità prevalga sulla (possibile) correttezza.