我正在研究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'相同)?
提前致谢。
答案 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
不是字符串。框架必须在将它们连接到字符串之前将true
或false
转换为字符串,并且恰好为它们定义转换的方式是第一个字母大写。