为什么Boolean.ToString输出“True”而不是“true”

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

有没有一个有效的理由是“真”而不是“真”? 在编写XML时,XML的布局types为小写 ,并且与C#的真/假不兼容(虽然对CLS不确定),但是它会中断。

更新

这是我用C#解决这个问题的非常黑客的方法(用于XML)

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

当然,这增加了另外1个方法到堆栈,但是到处移除了ToLowers()。

只有微软的人才能真正回答这个问题。 不过,我想提供一些有趣的事实;)

首先,这就是它在MSDN中所说的有关Boolean.ToString()方法的内容:

返回值

types:System.String

如果此实例的值为true, 则为TrueString;如果此实例的值为false, 则为FalseString

备注

此方法返回常量“True”或“False”。 请注意,XML区分大小写,并且XML规范将“真”和“假”识别为布尔值的有效集合。 如果要将ToString()方法返回的String对象写入XML文件,则应首先调用其String.ToLower方法将其转换为小写。

这里有趣的事实#1:它根本不返回TrueString或FalseString。 它使用硬编码文字“真”和“假”。 如果它使用了字段,那么它们不会有什么好处,因为它们被标记为只读,所以不会改变它们。

另一种方法, Boolean.ToString(IFormatProvider)更有趣:

备注

提供者参数是保留的。 它不参与这个方法的执行。 这意味着与提供者参数的大多数方法不同,Boolean.ToString(IFormatProvider)方法不反映文化特定的设置。

有什么解决scheme? 取决于你想要做什么。 无论如何,我敢打赌,这将需要一个黑客;)

…因为.NET环境旨在支持多种语言。

System.Boolean(在mscorlib.dll中)被devise为由语言在内部使用来支持布尔数据types。 C#使用全部小写字母作为关键字,因此是'bool','true'和'false'。

然而,VB.NET使用标准框架:因此“布尔”,“真”和“假”。

由于语言必须一起工作,因此不能将True.ToString()(C#)与True.ToString()(VB.NET)给出不同的结果。 CLRdevise人员为ToString()结果select了标准的CLR套pipe表示法。

布尔值true的string表示forms被定义为Boolean.TrueString。

(System.String也有类似的情况:C#把它作为'string'types)。

对于Xml,你可以使用XmlConvert.ToString方法。

这是简单的代码转换为全部小写。

然而,将“真”转换回“真”并不那么简单。

 true.ToString().ToLower() 

是我用于XML输出。

它与C#不兼容? Boolean.Parse和Boolean.TryParse不区分大小写,parsing通过比较值为“True”和“False”的Boolean.TrueString或Boolean.FalseString来完成。

编辑:当在reflection器中查看Boolean.ToString方法,事实certificate,string是硬编码,所以ToString方法如下所示:

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

我知道为什么它已经被解决,但是当涉及到“自定义”布尔格式时,我有两种扩展方法,我不能再生活了:-)

 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); } } 

用法是微不足道的。 以下将各种布尔值转换为其葡萄牙语表示:

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

原因是“真”是因为微软与XML标准的牢固结合。

来自维基百科 :“可扩展标记语言(XML)是一种标记语言,它定义了一套用人类可读和机器可读的格式对文档进行编码的规则。”

人类可读性是主观的,但在XML的眼中,使用单词“一”代替数字“1”是优选的。 你会注意到这种情况是使用枚举,因为这个单词被序列化而不是它的值(“FirstOption”而不是“0”或“1”)。

同样,文字通常遵循CamelCasing 。 因此,XML不使用“string”,而更喜欢“string”。 这就是为什么Boolean.TrueString是“True”,而Boolean.FalseString默认是“False”。

当bool.ToString产生True或False时,这可能是从旧的VB NOT。