2011-09-25 34 views

回答

3

MessageBox.Show()需要一个字符串作为其输入参数。

第一个示例失败,因为没有从整数到字符串的隐式转换。

第二个示例成功,因为"hoo" + i的计算结果为字符串。发生这种情况是因为C#语言定义了一个接受stringobject的加法运算符。通过致电ToString()object转换为string。当添加的操作数之一是string时,总是选择该字符串加法运算符。

+3

你走得太快了。 +运算符被转换为string.Concat()。其中有接受Object的重载。其中使用ToString()。 –

+0

@Hans是的,我不知道C#中的确切术语。 –

+1

@Hans其实大卫的措辞是最准确的。 .NET字符串类型没有添加运算符,但是该语言提供了一个。 (请参阅我的答案中的链接。)该规范没有提及Concat,它只包含具有全部字符串或全部对象参数的重载。 –

2

您的第一个代码段不起作用的原因很明显。 .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超载羚牛g 2个对象作为参数并返回字符串作为结果。而且由于MessageBox.Show方法需要一个字符串,因此这就是我已经显示的.Concat方法返回的结果。

+0

对不起达林你把我的问题弄错了...... – nawfal

+0

@nawfal,我错了什么?我已经解释了在使用这个'+'运算符以及为什么会起作用的情况下发生的第二种情况。不是你想知道的吗?为什么第二个工作,第一个不是? –

+0

@Darin nawfal指的是宽限期编辑 –

3

第二个版本转换为String.Concat的调用,它接受任何两个对象并返回一个字符串。这是因为如果你这样写的:

MessageBox.Show(String.Concat("hoo", i)); 
+1

Concat的使用是一个实现细节,因此与_why_代码编译无关。这是语言规范,根本没有提到Concat。 –

1

因为在你的第二个例子,("hoo" + i)被解释为一个字符串,你的第一个例子传递一个int为字符串参数。执行该代码,以证明:

Console.WriteLine((5).GetType()); 
Console.WriteLine(("hoo" + 5).GetType()); 
0

MessageBox.Show()方法只接受字符串类型的参数。在第一种情况下,该参数的类型为int,并且在intstring之间没有隐式转换。代码不是compilabel。

在第二种情况下,int转换为字符串,这要归功于为string定义的+运算符。这里用于连接 - 当+的其中一个参数类型为string时,它以这种方式工作。因此该参数会自动转换为string并且代码正常工作。结果是string

0

MessageBox不知道如何处理int作为第一段代码中的一个参数。但相反,它期望一个字符串,并且该字符串可以通过operator +将该int连接到自身。 MessageBox.Show()然后可以采取该串联的字符串并显示它。

2

+操作符重载System.String。如果一个操作数是一个字符串,另一个可以是任何对象,并且ToString()将首先在该对象上被调用。

所以在第一次调用中,结果是一个整数,它不能隐式转换为一个字符串。在第二次调用中,调用+运算符,整数转换为字符串,并返回字符串。

来源:Section 7.7.4 of the C# language specification

相关问题