tags:

views:

3812

answers:

7
true.ToString() 
false.toString();

Output:
True
False

Is there a valid reason for it being "True" and not "true"? It breaks when writing XML as XML's boolean type is lower case, and also isn't compatible with C#'s true/false (not sure about CLS though).

Update

Here is my very hacky way of getting around it in C# (for use with XML)

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

Of course that adds 1 more method to the stack, but removes ToLowers() everywhere.

+3  A: 

How is it not compatible with C#? Boolean.Parse and Boolean.TryParse is case insensitive and the parsing is done by comparing the value to Boolean.TrueString or Boolean.FalseString which are "True" and "False".

EDIT: When looking at the Boolean.ToString method in reflector it turns out that the strings are hard coded so the ToString method is as follows:

public override string ToString()
{
    if (!this)
    {
        return "False";
    }
    return "True";
}
Rune Grimstad
Wow... That's probably the only context in C# where the construct "if (!this)" is valid!
DrJokepu
so why isn't it return "false" is what I'm asking
Chris S
Excactly why is hard to tell. Probably by chance actually...
Rune Grimstad
A: 

It's simple code to convert that to all lower case.

Not so simple to convert "true" back to "True"

true.ToString().Tolower()

is what I use for xml output.

John
+5  A: 

For Xml you can use XmlConvert.ToString method.

bruno conde
+15  A: 

...because the .NET environment is designed to support many languages.

System.Boolean (in mscorlib.dll) is designed to be used internally by languages to support a boolean datatype. C# uses all lowercase for its keywords, hence 'bool', 'true', and 'false'.

VB.NET however uses standard casing: hence 'Boolean', 'True', and 'False'.

Since the languages have to work together, you couldn't have true.ToString() (C#) giving a different result to True.ToString() (VB.NET). The CLR designers picked the standard CLR casing notation for the ToString() result.

The string representation of the boolean true is defined to be Boolean.TrueString.

(There's a similar case with System.String: C# presents it as the 'string' type).

stusmith
They had to accommodate VB from the looks of things
Chris S
I would say C# is the "odd" language. Everything public in .NET is CamelCase - System.Boolean, True, System.String, etc - it's C#'s C heritage that lead to the aliasing of String to string, Boolean to bool, True to true, etc. (Although my personal preference is still C#).
stusmith
+15  A: 

Only people from Microsoft can really answer that question. However, I'd like to offer some fun facts about it ;)

First, this is what it says in MSDN about the Boolean.ToString() method:

Return Value

Type: System.String

TrueString if the value of this instance is true, or FalseString if the value of this instance is false.

Remarks

This method returns the constants "True" or "False". Note that XML is case-sensitive, and that the XML specification recognizes "true" and "false" as the valid set of Boolean values. If the String object returned by the ToString() method is to be written to an XML file, its String.ToLower method should be called first to convert it to lowercase.

Here comes the fun fact #1: it doesn't return TrueString or FalseString at all. It uses hardcoded literals "True" and "False". Wouldn't do you any good if it used the fields, because they're marked as readonly, so there's no changing them.

The alternative method, Boolean.ToString(IFormatProvider) is even funnier:

Remarks

The provider parameter is reserved. It does not participate in the execution of this method. This means that the Boolean.ToString(IFormatProvider) method, unlike most methods with a provider parameter, does not reflect culture-specific settings.

What's the solution? Depends on what exactly you're trying to do. Whatever it is, I bet it will require a hack ;)

Vojislav Stojkovic
A: 

This probably harks from the old VB NOT .Net days when bool.ToString produced True or False.

ck
Prior to .NET the Boolean data type in VB (in fact, all data types) did not have methods.
Boo
A: 

Just thought I'd mention this...
I've just read some clever workaround to deserialize "True" as a boolean type in C# on an msdn blog!

see http://blogs.msdn.com/helloworld/archive/2009/04/03/workaround-to-deserialize-true-false-using-xmlserializer.aspx

Peter