2012-04-27 21 views

risposta

139

Ci sono 2 sovraccarichi di ToString che entrano in gioco qui

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

Il compilatore C# cerca essenzialmente di scegliere il sovraccarico di più specifico che lavorerà con l'ingresso. Un valore null è convertibile in qualsiasi tipo di riferimento. In questo caso string è più specifico di object e quindi verrà selezionato come vincitore.

Nel null as object hai solidificato il tipo di espressione come object. Ciò significa che non è più compatibile con il sovraccarico string e il compilatore sceglie il sovraccarico object poiché è l'unico compatibile rimanente.

I dettagli molto pelosi di come funziona questo tie break sono trattati nella sezione 7.4.3 delle specifiche del linguaggio C#.

+15

Ok. Quindi usa un sovraccarico invece dell'altro. Ha senso. Ma non dovrebbero entrambi i sovraccarichi restituire la stessa cosa? +1 btw. –

+2

@JohnMacIntyre - Dipende dal team di sviluppo e non dal compilatore. – JonH

+0

+1 Ottima spiegazione. – JonH

61

A seguito di JaredPar's excellent overload resolution risposta - la domanda rimane: "Perché Convert.ToString(string) ritorno null, ma Convert.ToString(object) ritorno string.Empty"?

E la risposta è ... perché the docs dicono so:

Convert.ToString (stringa) restituisce "l'istanza di stringa specificata; viene eseguita alcuna conversione vera e propria."

Convert.ToString (oggetto) restituisce "la rappresentazione di stringa del valore o String.Empty se il valore è null."

EDIT: Quanto alla questione se si tratta di un "bug nelle specifiche", "design molto male API", "perché è stato specificato come questo", ecc - mi prendo un colpo a una certa logica perché non lo vedo come un grosso problema.

  1. System.Convert ha metodi per convertire ogni tipo di base di stessa. Questo è strano - dal momento che nessuna conversione è necessaria o possibile, quindi i metodi finiscono solo per restituire il parametro. Convert.ToString(string) si comporta allo stesso modo. Presumo che questi siano qui per gli scenari di generazione del codice.
  2. Convert.ToString(object) ha 3 scelte quando superato null. Getta, restituisce null o restituisce string.Empty. Il lancio sarebbe negativo - doppiamente così con l'assunzione che questi sono usati per il codice generato. Restituire null richiede che il chiamante esegua un controllo nullo - di nuovo, non è una grande scelta nel codice generato. Restituendo string.Empty sembra una scelta ragionevole.Il resto di System.Convert riguarda i tipi di valore, che hanno un valore predefinito.
  3. È discutibile se restituire null sia più "corretto", ma string.Empty è decisamente più utilizzabile. Cambiare Convert.ToString(string) significa rompere la regola "nessuna conversione effettiva". Poiché System.Convert è una classe di utilità statica, ogni metodo può essere trattato logicamente come proprio. Ci sono pochissimi scenari del mondo reale in cui questo comportamento dovrebbe essere "sorprendente", quindi lascia che l'usabilità vinca (possibile) correttezza.
+0

È corretto dire che c'è un bug nelle specifiche? –

+3

che non risponde perché è così. Dire che si comporta così perché è documentato comportarsi in questo modo è tautologico. – CodesInChaos

+2

@JohnMacIntyre IMO è giusto dire che è un pessimo progetto API. – CodesInChaos

Problemi correlati