为什么在这种情况下我不需要将int转换为string?(.Net)
失败为什么在这种情况下我不需要将int转换为string?(.Net),.net,messagebox,.net,Messagebox,失败 private void button2_Click(object sender, EventArgs e) { int i = 5; MessageBox.Show(i); } 工作。为什么???MessageBox.Show()需要一个字符串作为其输入参数 第一个示例失败,因为没有从整数到字符串的隐式转换 第二个示例成功,因为“hoo”+i的计算结果为字符串。这是因为C语言定义了一个加法运算符,它接受字符串和对象。通过调用ToString(),将对象转换为字符串。当加
private void button2_Click(object sender, EventArgs e)
{
int i = 5;
MessageBox.Show(i);
}
工作。为什么???MessageBox.Show()
需要一个字符串作为其输入参数
第一个示例失败,因为没有从整数到字符串的隐式转换
第二个示例成功,因为
“hoo”+i
的计算结果为字符串。这是因为C语言定义了一个加法运算符,它接受字符串
和对象
。通过调用ToString()
,将对象转换为字符串。当加法的一个操作数是字符串时,总是选择此字符串加法运算符。由于明显的原因,您的第一个代码段不起作用。.Show
方法需要一个字符串,而您正在传递一个整数
有一种方法可以使用:
private void button2_Click(object sender, EventArgs e)
{
int i = 5;
MessageBox.Show("hoo" + i);
}
现在让我们考虑下面的片段:
private void button2_Click(object sender, EventArgs e)
{
int i = 5;
MessageBox.Show(i.ToString());
}
编译器实际上将其转换为:
int i = 5;
MessageBox.Show("hoo" + i);
这基本上是以下重载,将2个对象作为参数,并返回字符串作为结果。因为MessageBox.Show
方法需要一个字符串,所以它的工作原理就是我向您展示的.Concat
方法返回的字符串。第二个版本转换为对的调用,它接受任意两个对象并返回一个字符串。就好像你写过这样的话:
int i = 5;
MessageBox.Show(string.Concat("hoo", i));
因为在第二个示例中,(“hoo”+i)
被解释为字符串,第一个示例将int
传递给字符串参数。执行此代码以证明:
MessageBox.Show(String.Concat("hoo", i));
MessageBox.Show()
方法只接受字符串类型的参数。在第一种情况下,参数的类型为int
,并且int
和string
之间没有隐式转换。而且代码不是可编译的
在第二种情况下,int
由于为string
定义了+
运算符而被转换为string。此处用于连接-当+
的一个参数的类型为字符串时,它以这种方式工作。因此,参数将自动转换为字符串
,代码将正常工作。结果是string
MessageBox
不知道如何将int
作为第一段代码中的参数。但是它需要一个字符串,并且该字符串可以通过运算符+将该int连接到自身。然后,MessageBox.Show() System.String的+运算符重载。如果一个操作数是字符串,另一个可以是任何对象,将首先对该对象调用ToString()
因此,在第一个调用中,结果是一个整数,不能隐式转换为字符串。在第二个调用中,调用+运算符,将整数转换为字符串,以字符串形式返回
来源:@nawfal,我做错了什么?我已经解释了在第二种情况下,当您使用这个+
操作符时会发生什么,以及它为什么工作。这不是你想知道的吗?为什么第二部有效而第一部无效?@David Heffernan,啊,是的,编辑部确实有效。重要的是你得到的最终产品的质量,而不是它是如何制造的:——)@Darin在这样一个C#问题中,如果你在头两分钟内没有得到投票,你的答案最终会从顶部往下拖4页,所以我理解这个过程@大卫·赫弗南我真的不在乎选票和声誉。我关心的是用高质量的答案为社区做出贡献。这是我唯一关心的事。好吧。事实上,我认为如果答案在最初的15分钟内隐藏起来(比如说)会更好,这样所有的宽限期编辑都可以在私下进行,人们可以给出一个格式良好的答案,而不会被淹没。你走得太快了。+运算符被转换为string.Concat()。它具有接受对象的重载。是的,我不知道C#中的确切术语。事实上,大卫的措辞是最准确的。.NET字符串类型没有加法运算符,但该语言提供了加法运算符。(请参阅我答案中的链接。)规范没有提到Concat,它只包含具有所有字符串或所有对象参数的重载。@HansPassant看到他们所说的与上面提到的David相同。是的,底层过程必须是string。Concat当然……呵呵,支持正确的答案可能很困难。喝杯啤酒,今天再次回答,晚安:)Concat的使用是一个实现细节,因此与代码编译的原因无关。这在语言规范中,根本没有提到Concat。
Console.WriteLine((5).GetType());
Console.WriteLine(("hoo" + 5).GetType());