2010-12-20 62 views
3

這是超級愚蠢的,但我GOOGLE和檢查引用,我只是無法找到答案...爲什麼可以將一個int或浮點數等作爲一個字符串的一部分而不通過交談,而不是它自己?那就是:爲什麼:string st =「」+ 12;工作在C#沒有轉換?

,而這項工作很好:

string st = "" + 12; 

這不(當然):

string st = 12; 

在哪裏神奇嗎?我知道它的工作原理我只想知道它爲什麼起作用以及如何控制轉換的完成方式?

+4

檢查此鏈接:http://stackoverflow.com/questions/4472900/how-is-null-true-a-string – Chandu 2010-12-20 14:06:41

+1

@Cyber​​nate:我**知道**有人打算鏈接:) – BoltClock 2010-12-20 14:08:50

+0

: )..是的..它在我的最愛列表中.. – Chandu 2010-12-20 14:10:47

回答

4

在第一個語句中,+的左操作數是一個字符串,因此+成爲連接運算符。編譯器找到該運算符的重載,它將一個字符串和一個任意值作爲操作數。這將兩個操作數轉換爲字符串(使用ToString())然後將它們連接起來。

第二個聲明不起作用,因爲沒有從intstring的隱式轉換。

您可以通過使用括號來改變操作的順序(半有效)或通過編寫代碼以先發制人地處理轉換來控制轉換的完成方式。

0

因爲如果其中一個參數是字符串,編譯器將在所有對象上調用.ToString()

0

這是因爲操作符+在字符串數據類型上的操作符重載。

1

這是如何設計字符串連接的工作方式,並且BoltClock's answer指出,編譯器使用+作爲字符串連接運算符。從C# Language Specification上字符串連接,我們發現:

任何非字符串參數是通過調用從object類型繼承虛擬ToString方法轉化爲它的字符串表示。

0

因爲第一個是一個表達式,並且C#會進行隱式轉換。

第二個是帶有靜態值的分配,並且該靜態值沒有要調用的方法。

只要被賦值的值是一個變量或表達式返回,就會有一個toSting方法來調用。

0

這是因爲編譯器將該添加翻譯爲對String.Concat()的調用。

在內部,所有操作數都被裝箱(如有必要)並傳遞給String.Concat方法(當然,所有參數都調用ToString())。

1

.NET中的字符串連接最終解析爲調用靜態String.Concat方法的重載之一。這是一種優化,可以減少在單個語句中出現多重連接時創建的臨時字符串的數量。

簡而言之,這個工作的原因是因爲一些String.Concat重載將在參數列表中接受object,並且因爲int,float等本質上是對象,所以它們可以傳遞給Concat重載,它接受一個或更多object參數。 Concat內部基本上會對接收到的對象執行.ToString(),因此將您的int轉換爲其字符串表示形式。

在你的具體例子

string st = "" + 12; 

編譯器將reconize第一個字符串是空的,只需調用String.Concat(object)超載。它會將整數12轉換爲一個字符串並將其分配給st

此過載被調用,因爲整數可隱式裝箱以適合對象類型,因此滿足方法重載選擇。

相關問題