2011-04-01 7 views
9

ho qualche codice come:Perché i valori non sono convertibili in modo implicito in stringa in C#?

int value = 5; 
MessageBox.Show (value); 

e la MessageBox.Show lamenta dicendo:

"non può convertire da 'int' a 'stringa'"

mi sembra di ricordare alcuni casi in cui i valori sembrano essere convertiti implicitamente in valori stringa, ma non possono richiamarli esattamente.

Qual è la ragione alla base di questa decisione secondo cui qualsiasi valore non è convertibile implicitamente in valori stringa?

+0

Eventuali duplicati di http : // StackOverflow.it/questions/751303/can not-implicitly-convert-type-x-to-string-when-and-how-it-decides-that-it – rsenna

+0

Questa domanda sulla conversione implicita mancante o sulla chiamata al Messagebox.Show con un intero? –

+0

Conversione implicita. –

risposta

18

MessageBox.Show() accetta solo una stringa. Quando si utilizza qualcosa come Debug.WriteLine, accetta un sacco di diversi tipi di oggetto, tra cui object e quindi chiama ToString() su tale oggetto. Questo è probabilmente quello che stai vivendo.

+0

+1 3 unicorni! Si! – hunter

+0

Grazie, ha senso. –

2

Per il motivo esatto, dovresti chiedere ai compilatori C# o a uno dei ragazzi di runtime .NET.

Tuttavia, non ci sono posti nel framework .NET o nel linguaggio C# in cui i valori sono automaticamente e implicitamente convertibili in stringhe.

Si potrebbe, tuttavia, pensare al modo in cui la concatenazione delle stringhe funziona, ma funziona solo perché ci sono molti overload sul metodo string.Concat, incluso uno che accetta un oggetto.

In altre parole, ciò è consentito:

string s = "Hello there: " + 4; 

Altri metodi in giro per il quadro ha anche un sacco di sovraccarichi, come Debug.WriteLine e tale, dove sarà facilmente accettare il tuo numero intero o decimale, convertire a una stringa attraverso una chiamata a .ToString e quindi stamparlo.

Non è, tuttavia, qualcosa incorporato in stringa o int, ma il metodo stesso.

+0

Ciao downvoter, per favore lascia un commento su cosa c'è che non va, così ho la possibilità di correggerlo e imparare dai miei errori. –

10

A breve soluzione (in tutto il mondo è necessario una stringa):

MessageBox.Show(""+value); 

ma io preferirei un ToString() o un String.Format() nella maggior parte dei casi.

Per rispondere alla parte "Perché": perché le conversioni impure possono essere pericolose e compromettere la sicurezza del tipo.
"1" + 2 = "12", non sempre ciò che si desidera/si aspetta.

+0

Buon punto Henk, non conoscevo i contro delle conversioni implicite. –

+0

@Joan: Se hai familiarità con il modo in cui javascript gestisce le stringhe (o almeno lo vedi abbastanza), apprezzerai che la maggior parte delle lingue non esegue tutte le conversioni implicite. :) Guarda [this] (http://stackoverflow.com/questions/1995113/strangest-language-feature/1995298#1995298) e tutte le altre risposte relative a javascript. –

-1

Prova

MessageBox.Show(value.ToString()); 
Problemi correlati