2011-09-25 53 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

相關問題