[英]Strings and ints, implicit and explicit
有一個同事問我這個問題,在我腦子里迷茫的狀態我沒有答案:
你為什么這樣做:
string ham = "ham " + 4;
但不是:
string ham = 4;
如果在連接時存在字符串轉換的隱式轉換/操作,為什么在將其指定為字符串時不一樣? (當然,沒有做一些運算符重載)
連接編譯器時,將語句"ham" + 4
轉換為對String.Concat
的調用,后者接受兩個object
參數,因此將值4
裝箱,然后調用ToString
。
對於賦值,沒有從int
到string
隱式轉換,因此您無法在不顯式轉換string
情況下將4
分配給string
。
換句話說,編譯器對兩個賦值的處理方式截然不同,盡管它們在C#中看起來非常相似。
進行連接時沒有隱式轉換。 字符串連接解析為String.Concat調用,該調用具有帶對象的重載。 正是這個重載執行(顯式)轉換為字符串。
第一個表達式右側的值是一個字符串,而第二個表達式右側的值不是。 連接在第一個場景中提供了魔力,其中賦值沒有做任何特殊的事情。 在第二種情況下,任務繼續發揮愚蠢。
表達方式
"ham " + 4
基於字符串類型和加法運算符的組合強制將4隱式轉換為字符串。 具體來說,它是“+”運算符的質量,當執行運算符重載時,您可以手動實現相同類型的事物。
一個類似且不太明顯的例子是:
long myNumber = Int64.MaxValue - 1;
在這種情況下,“1”應該被評估為32位整數,但它是隱式轉換的。 您可以查看C#語言規范第6.1節,了解編譯器支持的隱式轉換的詳盡列表。
編輯:要清楚,我所引用的語言規范部分列出了編譯器支持的隱式轉換,而像“+”這樣的運算符可以有自己支持的轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.