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

Chr*_*s S 226 .net c# boolean

true.ToString() 
false.toString();

Output:
True
False
Run Code Online (Sandbox Code Playgroud)

是否有正当理由认为它是"真实"而非"真实"?在写XML时它会中断,因为XML的布尔类型是小写的,并且与C#的真/假不兼容(虽然不确定CLS).

更新

这是我在C#中解决它的非常hacky方式(用于XML)

internal static string ToXmlString(this bool b)
{
    return b.ToString().ToLower();
}
Run Code Online (Sandbox Code Playgroud)

当然,这会给堆栈增加1个方法,但是除去ToLowers().

Voj*_*vic 160

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

首先,这是它在MSDN中关于Boolean.ToString()方法的说法:

回报价值

键入:System.String

TrueString如果此实例的值是true,或者FalseString如果此实例的值是假的.

备注

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

这就是有趣的事实#1:它根本不会返回TrueString或FalseString.它使用硬编码文字"True"和"False".如果它使用了字段,那对你没有任何好处,因为它们被标记为只读,所以没有改变它们.

替代方法Boolean.ToString(IFormatProvider)甚至更有趣:

备注

provider参数是保留的.它不参与此方法的执行.这意味着与大多数带有provider参数的方法不同,Boolean.ToString(IFormatProvider)方法不反映特定于文化的设置.

解决方案是什么?取决于你究竟想做什么.无论是什么,我打赌它需要一个黑客;)

  • 可观察的结果是一样的.实施不是. (21认同)
  • 我责怪 Visual Basic,它使用 True 和 False 作为其文字值。 (5认同)
  • 如果我错了,请更正我,但对Boolean.ToString()的解释没有发现任何问题。`bool.TrueString`是一个只读字段,其中包含硬编码文字_“ True” _。因此,假设返回字符串“ TrueString”与返回存储在其中的硬编码文字_“ True” _相同,因为返回字符串始终返回值而不是引用。 (2认同)
  • @FernandoNeira,如果明天将硬编码的文字`TrueString`更改为小写"true",方法`bool.ToString()`仍将返回pascal case"True"文字. (2认同)

stu*_*ith 104

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

System.Boolean(在mscorlib.dll中)被设计为由语言在内部使用以支持布尔数据类型.C#对其关键字使用全部小写,因此'bool','true'和'false'.

然而,VB.NET使用标准外壳:因此'布尔','真'和'假'.

由于语言必须协同工作,因此无法使用true.ToString()(C#)为True.ToString()(VB.NET)提供不同的结果.CLR设计者为ToString()结果选择了标准的CLR套管符号.

布尔值true的字符串表示形式定义为Boolean.TrueString.

(System.String也有类似的情况:C#将其表示为'字符串'类型).

  • 我会说C#是"奇怪的"语言..NET中公共的一切都是CamelCase - System.Boolean,True,System.String等 - 它是C#的C遗产,它导致String到字符串,布尔到bool,True到true等等(虽然我个人偏好是还是C#). (5认同)
  • 他们不得不从事物的外观中容纳VB (4认同)
  • 另外,很好的理由(对我来说)转换为小写很容易,而很难使它成为CamelCase特别是当使用VB时就像@John Burns所说的那样.否则VB用户不能也永远不会使用`ToString()`并强制使用`if(b,"True","False")`.所以像我这样的c#用户需要牺牲才能使用`ToLower()`:) (3认同)
  • @MarkLopez您的评论不正确,请参阅此处:http://msdn.microsoft.com/en-us/library/c8f5xwh7.aspx.此外,查找布尔定义显示它实际上是一个结构,并且两者具有相同的属性. (2认同)
  • 虽然你的答案有所启发,但我不明白“True”如何比“true”更“标准”。看来后者更受欢迎。 (2认同)

bru*_*nde 49

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

  • 这似乎是迄今为止最优雅的方法.没有额外的编程,并使用实际为xml输出创建的官方库. (4认同)

Joh*_*ohn 22

这是将其转换为全部小写的简单代码.

然而,将"true"转换回"True"并不是那么简单.

true.ToString().ToLower() 
Run Code Online (Sandbox Code Playgroud)

是我用于xml输出的.

  • 您可以使用System.Globalization.CultureInfo.InvariantCulture.TextInfo.ToTitleCase将"true"转换回"True". (3认同)

Run*_*tad 8

它与C#有什么不兼容?Boolean.Parse和Boolean.TryParse不区分大小写,并且通过将值与Boolean.TrueString或Boolean.FalseString("True"和"False")进行比较来完成解析.

编辑:当在反射器中查看Boolean.ToString方法时,结果证明字符串是硬编码的,因此ToString方法如下:

public override string ToString()
{
    if (!this)
    {
        return "False";
    }
    return "True";
}
Run Code Online (Sandbox Code Playgroud)

  • 哇......这可能是C#中唯一的上下文,其中构造"if(!this)"是有效的! (20认同)
  • @TamasCzinege`这可能是C#中构造"if(!this)"有效的唯一上下文!"你挑战我,你松了.https://gist.github.com/Steinblock/10df18afb948866be1ba - 今天也是George Boole的第200个生日 (6认同)
  • 那么为什么不回归"假"就是我所要求的 (2认同)

Lou*_*ier 5

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法很简单.以下内容将各种bool值转换为其葡萄牙语表示:

string verdadeiro = true.ToString("verdadeiro", "falso");
string falso = false.ToString("verdadeiro", "falso");
bool? v = null;
string nulo = v.ToString("verdadeiro", "falso", "nulo");
Run Code Online (Sandbox Code Playgroud)