Почему String.Concat возвращает True вместо true (то же самое с false)?

Я изучаю темы бокса и распаковки из C # 5.0 в двух словах от Джозефа Альбахари и Бена Альбахари. Copyright 2012 Джозеф Альбахари и Бен Альбахари, 978-1-449-32010-2, но мне нужно расширить свои знания, и я нашел статью MSDN: Упаковка и распаковка (Руководство по программированию C #), в нем я нашел этот пример кода (очевидно, не связанный с основной темой):

Console.WriteLine (String.Concat("Answer", 42, true));

После выполнения он возвращается:

Answer42True

Почему это происходит с буквальным «истина» (то же самое происходит с «ложью»)?

Тест выполнения.

Заранее спасибо.


person InfZero    schedule 01.03.2014    source источник
comment
@ SonerGönül не уверен, что это тот же вопрос ... Это может быть следующий вопрос.   -  person Ant P    schedule 01.03.2014
comment
@AntP Это точно такой же вопрос. Поскольку String.Concat преобразует их в строку, реальный вопрос будет в том, почему true.ToString() равно True, а не true.   -  person Soner Gönül    schedule 01.03.2014
comment
Нет, это не тот же вопрос, потому что спрашивающий не обязательно знает, что String.Concat преобразует свои параметры в строку. Итак, ответ на этот вопрос заключается в том, что String.Concat преобразует свои параметры в строку, а вы передаете ей логическое значение. Следовательно, следующий вопрос может быть таким же связанным. Вы прыгаете с пистолета.   -  person Ant P    schedule 01.03.2014
comment
Другой вопрос является наиболее абстрактным, он служит основой для объяснения многих фактов (например, поведения метода String.ToString) шахты. Так что, с моей точки зрения, они (в точности) не совпадают.   -  person InfZero    schedule 01.03.2014


Ответы (4)


В качестве примера, если вы попытаетесь декомпилировать метод String.Concat() в mscorlib.dll, вы получите что-то вроде этого

      for (int index = 0; index < args.Length; ++index)
      {
        object obj = args[index];
        values[index] = obj == null ? string.Empty : obj.ToString(); //which  will call the `ToString()` of `boolean struct` 

      }         

ToString() метод, который по умолчанию вызывается string.Concat методом, он выглядит следующим образом

 public override string ToString()
    {
      return !this ? "False" : "True";
    }
person BRAHIM Kamel    schedule 01.03.2014

Это потому что....

true.ToString() == "True"

И String.Concat должен преобразовывать свои аргументы в строки, а true - это логическое значение!

person Ant P    schedule 01.03.2014

В первую очередь взгляните на: Почему Boolean.ToString выводит True и неправда

Нет String.Concat(string, int, bool) перегрузки, поэтому ваш код вызывает ближайшую перегрузку, которая равна String.Concat(object, object, object).

И метод String.Concat(Object arg0, Object arg1, Object arg2) реализован следующим образом;

public static String Concat(Object arg0, Object arg1, Object arg2)
{
        if (arg0 == null)
        {
            arg0 = String.Empty;
        }

        if (arg1==null) {
            arg1 = String.Empty;
        }

        if (arg2==null) {
            arg2 = String.Empty;
        }

        return Concat(arg0.ToString(), arg1.ToString(), arg2.ToString());
}

Как видите, все объекты конвертируются в строку в последней строке.

Вот почему ваш код работает так;

String.Concat("Answer", 42.ToString(), true.ToString()));

И будет;

String.Concat("Answer", "42", "True"));

И результат будет;

Answer42True
person Soner Gönül    schedule 01.03.2014

true не является строкой. Платформа должна преобразовать true или false в строки, прежде чем объединять их в строку, и так уж получилось, что для них определено преобразование так, что первая буква написана с заглавной буквы.

person OSborn    schedule 01.03.2014