private void button2_Click(object sender, EventArgs e)
{
int i = 5;
MessageBox.Show(i);
}
失败。。
private void button2_Click(object sender, EventArgs e)
{
int i = 5;
MessageBox.Show("hoo" + i);
}
工程。为什么??
MessageBox.Show()
需要一个字符串作为其输入参数。
第一个示例失败,因为没有从整数到字符串的隐式转换。
第二个示例成功,因为"hoo" + i
计算结果为字符串。发生这种情况是因为 C# 语言定义了一个接受 string
和 object
的加法运算符。通过调用 ToString()
将object
转换为string
。当加法的操作数之一是string
时,始终选择此字符串加法运算符。
第二个版本转换为对 String.Concat
的调用,它接受任意两个对象并返回一个字符串。就好像你写了这个:
MessageBox.Show(String.Concat("hoo", i));
由于显而易见的原因,您的第一个代码片段不起作用。.Show
方法需要一个字符串,而您正在向其传递一个整数。
您可以使用一种.ToString()
方法:
private void button2_Click(object sender, EventArgs e)
{
int i = 5;
MessageBox.Show(i.ToString());
}
现在让我们考虑以下代码片段:
int i = 5;
MessageBox.Show("hoo" + i);
这实际上由编译器转换为:
int i = 5;
MessageBox.Show(string.Concat("hoo", i));
这基本上是以下.Concat
重载将 2 个对象作为参数并返回字符串作为结果。而且因为MessageBox.Show
方法需要一个字符串,所以它可以工作,因为这就是我向您展示的.Concat
方法返回的内容。
+ 运算符对于 System.String 是重载的。如果一个操作数是字符串,另一个操作数可以是任何对象,并且将首先在该对象上调用 ToString((。
因此,在第一次调用中,结果是一个整数,不能隐式转换为字符串。在第二次调用中,调用 + 运算符,并将整数转换为字符串,以字符串形式返回。
来源:C# 语言规范的第 7.7.4 节
因为在第二个示例中,("hoo" + i)
被解释为字符串,而第一个示例将int
传递给字符串参数。 执行此代码以证明:
Console.WriteLine((5).GetType());
Console.WriteLine(("hoo" + 5).GetType());
MessageBox.Show()
方法仅接受字符串类型的参数。在第一种情况下,参数的类型为 int
,int
和 string
之间没有隐式转换。而且代码不是兼容的。
在第二种情况下,由于为 string
定义的 +
运算符,int
被转换为字符串。这里用于串联 - 当 +
的参数之一为 string
类型时,它以这种方式工作。因此,参数会自动转换为string
并且代码正常工作。结果是string
.
MessageBox
不知道如何处理int
作为第一段代码中的参数。 而是它期待一个字符串,字符串可以通过 operator+ 将该 int 连接到自身。 然后,MessageBox.Show()
可以获取该串联字符串并显示它。