簡體   English   中英

字符串和整數,隱式和顯式

[英]Strings and ints, implicit and explicit

有一個同事問我這個問題,在我腦子里迷茫的狀態我沒有答案:

你為什么這樣做:

string ham = "ham " + 4;

但不是:

string ham = 4;

如果在連接時存在字符串轉換的隱式轉換/操作,為什么在指定為字符串時不一樣? (當然,沒有做一些運算符重載)

連接編譯器時,將語句"ham" + 4轉換為對String.Concat的調用,后者接受兩個object參數,因此將值4裝箱,然后調用ToString

對於賦值,沒有從intstring隱式轉換,因此您無法在不顯式轉換string情況下將4分配給string

換句話說,編譯器對兩個賦值的處理方式截然不同,盡管它們在C#中看起來非常相似。

二進制+運算符是為數字和字符串類型預定義的。 對於數字類型,+計算其兩個操作數的總和。 當一個或兩個操作數都是string類型時,+連接操作數的字符串表示。

參考

賦值運算符(=)將其右側操作數的值存儲在由其左側操作數表示的存儲位置,屬性或索引器中,並將該值作為結果返回。 操作數必須是相同的類型(或者右操作數必須可以隱式轉換為左操作數的類型)。

參考

進行連接時沒有隱式轉換。 字符串連接解析為String.Concat調用,該調用具有帶對象的重載。 正是這個重載執行(顯式)轉換為字符串。

第一個表達式右側的值是一個字符串,而第二個表達式右側的值不是。 連接在第一個場景中提供了魔力,其中賦值沒有做任何特殊的事情。 在第二種情況下,任務繼續發揮愚蠢。

表達方式

"ham " + 4 

基於字符串類型和加法運算符的組合強制將4隱式轉換為字符串。 具體來說,它是“+”運算符的質量,當執行運算符重載時,您可以手動實現相同類型的事物。

一個類似且不太明顯的例子是:

long myNumber = Int64.MaxValue - 1;

在這種情況下,“1”應該被評估為32位整數,但它是隱式轉換的。 您可以查看C#語言規范第6.1節,了解編譯器支持的隱式轉換的詳盡列表。

編輯:要清楚,我所引用的語言規范部分列出了編譯器支持的隱式轉換,而像“+”這樣的運算符可以有自己支持的轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM