为什么String.Concat返回'True'而不是'true'(与false相同)?

时间:2014-03-01 17:30:32

标签: c# .net boxing unboxing

我正在研究Joseph Albahari和Ben Albahari在Nutshell的 C#5.0中的拳击取消装箱主题。版权所有2012 Joseph Albahari和Ben Albahari,978-1-449-32010-2 ,但我需要扩展知识的深度,我找到了MSDN文章:Boxing and Unboxing (C# Programming Guide),我发现这个例子代码(显然与主题没有内在联系):

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

一旦执行,它将返回:

Answer42True

为什么这会发生在文字'true'上(与'false'相同)?

Execution test

提前致谢。

4 个答案:

答案 0 :(得分:5)

这是因为......

true.ToString() == "True"

并且String.Concat必须将其参数转换为字符串,而true是一个bool!

答案 1 :(得分:4)

如果您尝试在mscorlib.dll中反编译String.Concat()方法,请参阅示例原因 你会得到这样的东西

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

答案 2 :(得分:3)

Takea首先看一下:Why does Boolean.ToString output "True" and not "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

答案 3 :(得分:2)

true不是字符串。框架必须在将它们连接到字符串之前将truefalse转换为字符串,并且恰好为它们定义转换的方式是第一个字母大写。