为什么在这种情况下我不需要将 int 转换为字符串?(.Net).


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# 语言定义了一个接受 stringobject 的加法运算符。通过调用 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() 方法仅接受字符串类型的参数。在第一种情况下,参数的类型为 intintstring 之间没有隐式转换。而且代码不是兼容的。

在第二种情况下,由于为 string 定义的 + 运算符,int 被转换为字符串。这里用于串联 - 当 + 的参数之一为 string 类型时,它以这种方式工作。因此,参数会自动转换为string并且代码正常工作。结果是string.

MessageBox不知道

如何处理int作为第一段代码中的参数。 而是它期待一个字符串,字符串可以通过 operator+ 将该 int 连接到自身。 然后,MessageBox.Show()可以获取该串联字符串并显示它。

最新更新