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

4
我正在学习Joseph Albahari和Ben Albahari的《C# 5.0 in a Nutshell》一书中关于boxingunboxing的话题。版权所有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”相同)? 执行测试
提前感谢。

1
@SonerGönül 不确定这是同一个问题...可能是下一个问题。 - Ant P
@AntP 这是完全相同的问题。由于String.Concat将它们转换为字符串,真正的问题在于为什么true.ToString()True而不是true - Soner Gönül
1
不,这不是同一个问题,因为提问者不一定知道String.Concat将其参数转换为字符串。所以这个问题的答案是“因为String.Concat将其参数转换为字符串,而你正在传递一个布尔值。”因此,下一个问题可能会像链接的那样。你在过早地下结论。 - Ant P
另一个问题是最抽象的,它作为解释我的许多事实(例如String.ToString方法的行为)的基础。因此,从我的角度来看,它们并不完全相同。 - InfZero
4个回答

5

这是因为......

true.ToString() == "True"

String.Concat 必须将其参数转换为字符串,而 true 是一个布尔值!


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

3
请先看一下这个问题:为什么 Boolean.ToString 输出的是 "True" 而不是 "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

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接