2010-05-17 32 views
6

Sé que al intentar convertir la cadena "0" a booleano fallará, también sé cómo solucionarlo, gracias a las respuestas de Jon Skeets en otras preguntas.¿Por qué falla Convert.ToBoolean ("0")?

Lo que me gustaría saber es POR QUÉ C# no reconoce "0" como una entrada válida para una conversión booleana, seguramente podría verlo como 0 = falso, 1 = verdadero, o incluso -1 = falso y 0 = cierto, de todos modos, mi lógica me dice que podría ser una entrada válida, ¿hay una muy buena razón por la que no? Mi apuesta es que vb6 viejo podría reconocer la entrada de cadena "0" como válida.

+0

aquí es la forma correcta de convertir para aquellos de ustedes interesados ​​- http://stackoverflow.com/questions/2606406/convert-toboolean1-throws-system-format-exception-in-c –

+2

También podría utilizar: Sistema .Xml.XmlConvert.ToBoolean (cadena), que acepta "0" y "1". –

+1

Tenga en cuenta que 'XmlConvert' requiere que" verdadero "y" falso "estén completamente en minúscula. –

Respuesta

8

La respuesta es simple, ya que es la forma en que se define el método. Sin embargo, en C# 0 no se evalúa a false, por lo que sería sorprendente si "0" se convirtiera en falso mediante Convertir.

+0

muy interesante, por lo que un Convert.ToBoolean (Convert.ToInt16 ("0")) también fallará? –

2

una cadena con valor siempre volverá a ser verdadera e incluso una cadena vacía.

+0

¿Por qué es esto? ¿Puede explicarlo con más detalle? –

+0

Si realmente necesita hacer que el algoritmo funcione, puede usar int.TryParse ("0", out i); luego convierta ese valor en booleano –

2

Supongo que es porque un programador de C que entra en un lenguaje .NET podría confundirse, ya que en C un molde directo del carácter '0' se evaluaría como 'verdadero', mientras que el carácter '\ 0 'evaluaría a' falso '.

(Esto se debe a que el carácter nulo en realidad es byte completo de ceros, y el '0' es un ASCII distinto de cero/Unicode/etc no lo es.)

+0

¿Hay algo que tenga que ver con la pureza del lenguaje? –

+0

Creo que se trata más de predictibilidad y de ser conservador que cualquier otra cosa. –

2

Es bastante sencillo, Convert.ToBoolean (String) llama a Boolean.TryParse(). Que solo acepta "Verdadero" o "Falso". Si desea ampliar las opciones, entonces puede, hay idiomas .NET que tienen un sistema de tipo más flexible. Es bien apoyada por el marco .NET:

bool b = (bool)Microsoft.VisualBasic.CompilerServices.Conversions.ToBoolean("0"); 

añadir una referencia a Microsoft.VisualBasic.dll

+0

Eso no es un comentario útil, ¿o sí? – Karlth

+1

Tiene razón, su comentario no fue útil. –

+0

Entonces hubiera dicho "** Este ** no es un comentario útil". :) – Karlth

0

http://msdn.microsoft.com/en-us/library/86hw82a3.aspx
De acuerdo con el enlace de arriba MSDN Este método convierte la representación de cadena especificado de un valor lógico su equivalente booleano

public static bool ToBoolean(
    string value 
) 

Parámetros

valor Tipo: System.String Una cadena que contiene el valor del bien o Boolean.TrueStringBoolean.FalseString. Valor de retorno

Tipo: System.Boolean true si el valor es igual a TrueString, o falso si el valor es igual a FalseString o nulo. Excepciones

1

Por la misma razón que el siguiente código no se compilará.

bool value = 0; 
//error CS0031: Constant value '0' cannot be converted to a 'bool' 
0

Siempre que usted dé "0" como parámetro se tiene en cuenta que como un valor de cadena. Y la cadena no se puede convertir a bool, no importa si es 0 o 1.

Cuestiones relacionadas