2011-04-01 4 views
9

tengo algo de código como:¿Por qué los valores no son implícitamente convertibles en cadena en C#?

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

y la MessageBox.Show se queja diciendo:

"no se puede convertir de 'int' a 'cadena'"

Creo recordar algunos casos en los que los valores parecen estar convertidos implícitamente en valores de cadena, pero no pueden recordarlos exactamente.

¿Cuál es la razón detrás de esta decisión que cualquier valor no es implícitamente convertible a valores de cadena?

+0

duplicado Posible de http ://desbordamiento de pila.com/questions/751303/can not-implicitly-convert-type-x-to-string-when-and-it-decide-that-it – rsenna

+0

¿Se trata de una cuestión de falta de conversión implícita o de invocación de Messagebox.Show con un número entero? –

+0

Conversión implícita. –

Respuesta

18

MessageBox.Show() solo acepta una cadena. Cuando utiliza algo como Debug.WriteLine, acepta varios tipos de objetos diferentes, incluido object, y luego llama al ToString() en ese objeto. Esto es probablemente lo que estás experimentando.

+0

+1 3 unicornios! ¡Sí! – hunter

+0

Gracias eso tiene sentido. –

2

Por la razón exacta, tendrías que preguntar al compilador de C# chicos, o uno de los chicos de .NET en tiempo de ejecución.

Sin embargo, no hay lugares en .NET Framework o en el lenguaje C# donde los valores se pueden convertir automática e implícitamente en cadenas.

Sin embargo, puede pensar en la forma en que funciona la concatenación de cadena, pero eso solo funciona porque hay muchas sobrecargas en el método string.Concat, incluida una que toma un objeto.

En otras palabras, esto está permitido:

string s = "Hello there: " + 4; 

Otros métodos alrededor en el marco también tiene un montón de sobrecargas, tales como Debug.WriteLine y tal, en el que aceptará fácilmente su número entero o decimal, convertir a una cadena a través de una llamada a .ToString, y luego imprimirlo.

No es, sin embargo, algo integrado en string o int, sino el método en sí mismo.

+0

Hola, votante, por favor deje un comentario sobre lo que está mal, para que tenga la oportunidad de corregirlo y aprender de mis errores. –

10

Una solución a corto (donde quiera que necesitan una cadena):

MessageBox.Show(""+value); 

pero preferiría un ToString() o una String.Format() en la mayoría de los casos.

Para responder a la pregunta "Por qué": porque las conversiones impícitas pueden ser peligrosas y pueden minar la seguridad del tipo.
"1" + 2 = "12", no siempre lo que desea/espera.

+0

Buen punto Henk, no sabía los inconvenientes de las conversiones implícitas. –

+0

@Joan: si está familiarizado con la forma en que javascript maneja cadenas (o al menos lo ha visto lo suficiente), apreciará que la mayoría de los idiomas no realizan tantas conversiones implícitas. :) Mira [this] (http://stackoverflow.com/questions/1995113/strangest-language-feature/1995298#1995298) y todas las demás respuestas relacionadas con JavaScript. –

-1

Trate

MessageBox.Show(value.ToString()); 
Cuestiones relacionadas