Почему Boolean.ToString выводит "True", а не "true",

true.ToString() 
false.toString();

Output:
True
False

Есть ли веская причина для того, чтобы он был "Истинным", а не "истинным"? Он ломается при написании XML, поскольку логический тип XML является строчным, а также несовместим с С# true/false (не уверен в CLS, хотя).

Обновление

Вот мой очень хакерский способ обойти его на С# (для использования с XML)

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

Конечно, это добавляет еще один метод в стек, но везде удаляет ToLowers().

Ответ 1

Только люди из Microsoft могут действительно ответить на этот вопрос. Тем не менее, я хотел бы предложить некоторые интересные факты об этом;)

Во-первых, это то, что он говорит в MSDN о методе Boolean.ToString():

Возвращаемое значение

Тип: System.String

TrueString, если значение этого экземпляр true, или FalseString if значение этого экземпляра ложно.

Примечания

Этот метод возвращает константы "True" или "False". Обратите внимание, что XML чувствителен к регистру, и Спецификация XML распознает "истинный" и "false" как действительный набор Булевы значения. Если объект String возвращенный методом ToString() должен быть записан в файл XML, его Метод String.ToLower должен быть сначала преобразовать его в в нижнем регистре.

Вот забавный факт №1: он вообще не возвращает TrueString или FalseString. Он использует жестко закодированные литералы "True" и "False". Не было бы хорошо, если бы оно использовало поля, потому что они помечены как только для чтения, поэтому их не меняют.

Альтернативный метод Boolean.ToString(IFormatProvider) еще более забавный:

Примечания

Параметр поставщика зарезервирован. Он не участвует в выполнении этого метода. Это означает, что метод Boolean.ToString(IFormatProvider), в отличие от большинства методов с параметром поставщика, не отражает настройки для конкретной культуры.

Какое решение? Зависит от того, что именно вы пытаетесь сделать. Что бы это ни было, я уверен, что это потребует взлома;)

Ответ 2

... потому что среда .NET предназначена для поддержки многих языков.

System.Boolean(в mscorlib.dll) предназначен для внутреннего использования языками для поддержки булевского типа данных. С# использует все строчные буквы для своих ключевых слов, поэтому "bool", "true" и "false".

Однако VB.NET использует стандартный корпус: следовательно, "Boolean", "True" и "False".

Поскольку языки должны работать вместе, вы не можете иметь true.ToString() (С#), давая другой результат True.ToString() (VB.NET). Дизайнеры CLR выбрали стандартную нотацию оболочки CLR для результата ToString().

Строковое представление логического истины определяется как Boolean.TrueString.

(Аналогичный случай с System.String: С# представляет его как тип 'string').

Ответ 3

Для Xml вы можете использовать метод XmlConvert.ToString.

Ответ 4

Это простой код для преобразования этого кода во все строчные буквы.

Не так просто преобразовать "true" обратно в "True", однако.

true.ToString().ToLower() 

- это то, что я использую для вывода xml.

Ответ 5

Как это несовместимо с С#? Boolean.Parse и Boolean.TryParse нечувствительны к регистру, и синтаксический анализ выполняется путем сравнения значения с Boolean.TrueString или Boolean.FalseString, которые являются "True" и "False".

EDIT: при взгляде на метод Boolean.ToString в отражателе оказывается, что строки жестко закодированы, поэтому метод ToString выглядит следующим образом:

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

Ответ 6

Я знаю, почему это так, как это уже было рассмотрено, но когда дело доходит до "настраиваемого" логического форматирования, у меня есть два метода расширения, с которыми я не могу больше жить:-)

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

Использование тривиально. Следующее преобразует различные значения bool в их португальские представления:

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

Ответ 7

Причина true - "Истина" - это сильная связь Microsoft с стандартами XML.

От Wikipedia: "Расширяемый язык разметки (XML) - это язык разметки, который определяет набор правил для кодирования документов в формате, который как доступен для человека, так и машиночитаемым".

Человекочитаемый субъективен, но в глазах XML предпочтительнее использовать слово "один" вместо числа "1". Вы заметите, что это происходит с использованием перечислений, поскольку слово сериализуется вместо его значения ( "FirstOption" вместо "0" или "1" ).

Аналогично, текст обычно следует CamelCasing. Поэтому вместо "string" XML предпочитает "String". Вот почему Boolean.TrueString является "True" и Boolean.FalseString по умолчанию "False".

Ответ 8

Для людей, работающих с JSon, вы сталкиваетесь с такой же проблемой, используя JSonConvert для десериализации json в объекты. Как и в xml, вы можете использовать JSonConvert.ToString('bool value') для обхода столиц.

Ответ 9

Это, вероятно, связано со старыми днями VB NOT.Net, когда bool.ToString создала True или False.