¿Por qué Boolean.ToString da como resultado “verdadero” y no “verdadero”

true.ToString() false.toString(); Output: True False 

¿Hay alguna razón válida para que sea “Verdadero” y no “verdadero”? Se rompe cuando se escribe XML, ya que el tipo booleano de XML está en minúsculas , y tampoco es compatible con C # ‘s verdadero / falso (aunque no estoy seguro acerca de CLS).

Actualizar

Aquí está mi manera muy hacky de moverse en C # (para usar con XML)

 internal static string ToXmlString(this bool b) { return b.ToString().ToLower(); } 

Por supuesto, eso agrega 1 método más a la stack, pero elimina ToLowers () en todas partes.

Solo las personas de Microsoft pueden responder esa pregunta. Sin embargo, me gustaría ofrecer algunos hechos divertidos al respecto;)

Primero, esto es lo que dice en MSDN sobre el método Boolean.ToString () :

Valor de retorno

Tipo: System.String

TrueString si el valor de esta instancia es verdadero, o FalseString si el valor de esta instancia es falso.

Observaciones

Este método devuelve las constantes “Verdadero” o “Falso”. Tenga en cuenta que XML distingue entre mayúsculas y minúsculas y que la especificación XML reconoce “verdadero” y “falso” como el conjunto válido de valores booleanos. Si el objeto String devuelto por el método ToString () debe escribirse en un archivo XML, se debe llamar primero a su método String.ToLower para convertirlo a minúsculas.

Aquí viene el hecho divertido # 1: no devuelve TrueString o FalseString en absoluto. Utiliza literales codificados “True” y “False”. No te haría ningún bien si utiliza los campos, porque están marcados como de solo lectura, por lo que no hay cambios.

El método alternativo, Boolean.ToString (IFormatProvider) es aún más divertido:

Observaciones

El parámetro de proveedor está reservado. No participa en la ejecución de este método. Esto significa que el método Boolean.ToString (IFormatProvider), a diferencia de la mayoría de los métodos con un parámetro de proveedor, no refleja las configuraciones específicas de la cultura.

¿Cual es la solución? Depende de qué estás tratando de hacer exactamente. Sea lo que sea, apuesto a que requerirá un truco;)

… porque el entorno .NET está diseñado para admitir muchos idiomas.

System.Boolean (en mscorlib.dll) está diseñado para ser utilizado internamente por los idiomas para admitir un tipo de datos booleano. C # usa todas las minúsculas para sus palabras clave, de ahí ‘bool’, ‘verdadero’ y ‘falso’.

Sin embargo, VB.NET utiliza una carcasa estándar: de ahí ‘Boolean’, ‘True’ y ‘False’.

Como los idiomas tienen que funcionar juntos, no podría tener true.ToString () (C #) dando un resultado diferente a True.ToString () (VB.NET). Los diseñadores de CLR escogieron la notación de carcasa CLR estándar para el resultado de ToString ().

La representación de cadena de la verdad booleana se define como Boolean.TrueString.

(Hay un caso similar con System.String: C # lo presenta como el tipo ‘cadena’).

Para Xml puede usar el método XmlConvert.ToString .

Es un código simple para convertir eso en minúsculas.

Sin embargo, no es tan sencillo convertir “verdadero” en “Verdadero”.

 true.ToString().ToLower() 

es lo que uso para salida xml

¿Cómo no es compatible con C #? Boolean.Parse y Boolean.TryParse no distingue entre mayúsculas y minúsculas y el análisis se hace comparando el valor con Boolean.TrueString o Boolean.FalseString que son “True” y “False”.

EDITAR: Al mirar el método Boolean.ToString en el reflector, resulta que las cadenas están codificadas de manera que el método ToString es el siguiente:

 public override string ToString() { if (!this) { return "False"; } return "True"; } 

Sé que ya se ha abordado el motivo por el cual ya se ha abordado, pero cuando se trata del formato booleano “personalizado”, tengo dos métodos de extensión que ya no puedo vivir 🙂

 public static class BoolExtensions { public static string ToString(this bool? v, string trueString, string falseString, string nullString="Undefined") { return v == null ? nullString : v.Value ? trueString : falseString; } public static string ToString(this bool v, string trueString, string falseString) { return ToString(v, trueString, falseString, null); } } 

El uso es trivial. Lo siguiente convierte varios valores de bool a sus representaciones portuguesas:

 string verdadeiro = true.ToString("verdadeiro", "falso"); string falso = false.ToString("verdadeiro", "falso"); bool? v = null; string nulo = v.ToString("verdadeiro", "falso", "nulo"); 

La razón true es “Verdadero” es debido al fuerte vínculo de Microsoft con los estándares XML.

De Wikipedia : “Extensible Markup Language (XML) es un lenguaje de marcado que define un conjunto de reglas para codificar documentos en un formato que es legible por las personas y legible por máquina”.

Human-legible es subjetivo, pero a los ojos de XML, se prefiere usar la palabra “One” en lugar del número “1”. Notarás que esto sucede usando enumeraciones, ya que la palabra se serializa en lugar de su valor (“FirstOption” en lugar de “0” o “1”).

Del mismo modo, el texto comúnmente sigue a CamelCasing . Por lo tanto, en lugar de “cadena”, XML prefiere “Cadena”. Esta es la razón por la cual Boolean.TrueString es “True” y Boolean.FalseString es “False” por defecto.

Probablemente esto se deba a los días anteriores de VB NOT .Net cuando bool.ToString produjo True o False.