2010-09-08 35 views
1

我以爲類可以隱式轉換隻:爲什麼盒裝整數值可以隱式轉換爲字符串類型?

  • 在從其所源自
  • 它實現任何接口的鏈中的任何類

一個)上述無爲真在下面的例子中,使爲什麼盒裝整數值得到隱式轉換爲string類型:

string s = 100 + 「question」; 

b)瓦時y,則不會在明年分配的價值也得到隱式轉換爲string類型:

string s = 100; 

感謝名單

+0

順便說一句,您的項目符號列表省略了一些項目。您省略了身份轉換,協變和逆變接口轉換,用戶定義的隱式轉換以及轉換爲動態類型。 – 2010-09-08 19:17:45

回答

7

這只是字符串連接運算符 - 無關尤其是拳擊或整數......這是任何與串連接的值。

你的第二個例子不涉及任何串聯,因此沒有轉換。

從C#屬,節7.8.4:

對於x + y形式的操作, 二進制運算符重載解析 (§7.3.4)被施加到選擇 特定運營商實現。 操作數轉換爲所選 運算符的參數類型 ,結果 的類型是運算符的返回類型。

預定義的加法運算符是下面列出的 。對於枚舉類型的數字和 ,預定義的 加法運算符計算兩個操作數的總和。當一個或兩個操作數都是字符串類型時, 預定義的加法運算符 連接操作數的字符串表示 。

然後:

字符串連接:

string operator +(string x, string y); 
string operator +(string x, object y); 
string operator +(object x, string y); 

二進制+運算的這些重載執行字符串連接。 如果字符串連接的操作數爲空,則替換空字符串。 否則,通過調用從對象類型繼承的虛擬ToString方法,將任何非字符串參數轉換爲其字符串表示形式 。 如果ToString返回null,則替換空字符串。

事實上,在你的榜樣,與當前的MS C#編譯器,它只會框中整數,並呼籲string.Concat(object, object) - 但是編譯器知道將有相同的結果調用string.Concat(100.ToString(), "question")

一個有趣的事實點:在string類本身不存在+運算符。該語言對它有特殊的處理(正如我們已經看到的),最終致電Concat。這樣做的好處是,

x + y + z 

可以編譯成

string.Concat(x, y, z) 

可以一氣呵成執行整個級聯,而不是建立一個毫無意義的中間串。

(另請注意,編譯器進行編譯時常量字符串本身的級聯。)

+0

再次你擊敗了我!這麼快... – Aliostad 2010-09-08 18:34:43

+0

該死的雙眸!快16秒。我永遠不會以這樣的速度在C#標籤中捕捉到你。 – jjnguy 2010-09-08 18:37:02

+0

謝謝大家再見 – user437291 2010-09-08 18:41:31

2

這是+運算符的功能,而不是拳擊。

2

這與+運營商有關。

本質上,在這種情況下爲+方法簽名是:

public string +(string s) { 
    return this.ToString() + s; 
} 

所以,int被轉換到一個string

但是,試圖將int值附加到string參考中僅僅是語法錯誤。

相關問題