2012-01-17 53 views
9

Duplicar posibles:
Help converting type - cannot implicitly convert type 'string' to 'bool'No se puede convertir implícitamente el tipo 'cadena' a 'bool'

Tengo este código:

private double Price; 
private bool Food; 
private int count; 
private decimal finalprice; 

public void Readinput() 
{ 
    Console.Write("Unit price: "); 
    Price = Console.ReadLine(); 

    Console.Write("Food item y/n: "); 
    Food = Console.ReadLine(); 

    Console.Write("Count: "); 
    count = Console.ReadLine(); 
} 

private void calculateValues() 
{ 
    finalprice = Price * count; 
} 

y obtener la siguiente errores:

No se puede convertir implícitamente el tipo 'cadena' a 'bool'

No se puede convertir implícitamente el tipo 'cadena' de 'doble'

No se puede convertir implícitamente el tipo 'cadena' a 'int'

Puede no convertir implícitamente escriba 'doble' a 'decimal'. Existe una conversión explícita (¿falta un molde?)

Sé lo que significa, pero no sé cómo solucionarlo.

+0

Oye, ¿por qué bajan los votos? – ivowiblo

+0

¿Has leído algún tutorial antes de publicar la pregunta? –

+10

No creo que esta pregunta merezca tantos votos negativos. Darle instrucciones sería mucho más útil. – Bastardo

Respuesta

17

Utilice bool.Parse o bool.TryParse método para convertir el valor de cadena en boolean.

Price = double.Parse(Console.ReadLine()); 
Food =bool.Parse(Console.ReadLine()); 
count = int.Parse(Console.ReadLine()); 

No se puede convertir "y" o "n" valor booleano en lugar de su tienen que recibir el valor como una cadena y si es "y" a continuación, almacenar true, false lo contrario.

Console.Write("Food item y/n: "); 
string answer = Console.ReadLine(); 
if(answer=="y") 
    Food=true; 
else 
    Food=false; 

O (sugerencia de @ Mr-feliz)

Food = answer == "y" 

es necesario especificar conversión explícita al calcular finalprice.

private void calculateValues() 
{ 
    // convert double result into decimal. 
    finalprice =(decimal) Price * count; 
} 
+1

Probablemente quiera usar 'Food = answer ==" y ";' though – dvdvorle

5

Tienes que convertir lo que lees de la consola (que es una cadena) al tipo real usando la clase estática Convertir. Por ejemplo:

Console.Write("Count: "); 
count = Convert.ToInt32(Console.ReadLine()); 

Esto se bloquea si el argumento dado no se puede convertir, pero este no es su principal problema en este momento, así que vamos a mantenerlo simple.

1
Console.Write("Unit price: "); 
double.TryParse(Console.ReadLine(), out Price); 

Console.Write("Food item y/n: "); 
bool.TryParse(Console.ReadLine(), out Food); 

Console.Write("Count: "); 
int.TryParse(Console.ReadLine(), out count); 
0
private double Price; 
private bool Food; 
private int count; 
private decimal finalprice; 

public void Readinput() 
{ 
    Console.Write("Unit price: "); 
    double.TryParse(Console.ReadLine(), out Price); 

    Console.Write("Food item y/n: "); 
    bool.TryParse(Console.ReadLine(), out Food); 

    Console.Write("Count: "); 
    int.TryParse(Console.ReadLine(), out count); 
} 

private void calculateValues() 
{ 
    finalprice = Price * count; 
} 
+1

El uso de tryparse es inútil si no capta el resultado. ¿Cómo sabes que algo está mal? Utilice el clásico Parse con el lanzamiento de una excepción, o envuelva el tryparse con un 'if (! Tryparse (..)) manejo de errores' –

+0

De hecho, sería mejor cuando capte los errores pero la aplicación no se bloqueará y usará el valor predeterminado para double = 0, bool = false e int = 0. –

+0

Por lo tanto, depende del requisito comercial ... ¿debería el programa informar al usuario que escribió algo incorrecto? Creo que la respuesta es sí. La respuesta deberia ser si. Mi opinión es que los errores silenciosos son más peligrosos (puede conducir a problemas más adelante) que una falla de la aplicación. –

0

Tienes que envolver los Console.ReadLine() llamadas en las funciones del analizador apropiados, ya que (a diferencia de PHP, por ejemplo) C# es un lenguaje escrito a máquina estática, además, sólo las conversiones que se garantiza que sea segura y sin pérdidas se puede hacer de manera implícita:

Price = double.Parse(Console.ReadLine()); 

Console.Write("Food item y/n: "); 
// I think you want the user to type in "y", "Y", "n" or "N", right? 
Food = Console.ReadLine().ToUpper() == "Y"; 

Console.Write("Count: "); 
count = int.Parse(Console.ReadLine()); 

y en su método de cálculo, usted tiene que convertir explícitamente el doble resultante en un decimal ya que C# no admite la conversión implícita entre el punto fijo y valores de coma flotante:

finalprice = (decimal)(Price * count); 
Cuestiones relacionadas