簡體   English   中英

為什么“ +” +短轉換為44

[英]Why does '+' + a short convert to 44

我有一行代碼看起來像這樣:

MyObject.PhoneNumber = '+' + ThePhonePrefix + TheBizNumber;

基本上,我正在創建E164格式的電話號碼,然后將該字符串分配給對象的字符串屬性。 ThePhonePrefix是保存國際電話前綴的縮寫,TheBizNumber是保存電話號碼數字的字符串。

當我首先在字符串中串聯一個短字符串時,為什么沒有編譯器錯誤? 那為什么'+'+ 1等於44呢? 這是一個很難跟蹤的錯誤,因為沒有編譯錯誤,並且44是UK的電話前綴,所以所有“看上去”都像在起作用,因為客戶端代碼只看到了UK數字。 為什么是44?

在此處輸入圖片說明

43是字符“ +”的( http://www.asciitable.com/)ascii值。 編譯器將char加法解釋為加法,而不是串聯。 嘗試使用"+"代替以獲得預期的字符串行為。

當我首先在字符串中串聯一個短字符串時,為什么沒有編譯器錯誤?

使用+符號的字符串連接內部調用string.Concat ,內部對每個參數調用ToString 因此沒有錯誤。

為什么'+'+ 1

您正在執行字符/數字算術運算。 + 43 ,而short / int 1為44。

由於運算符+從左到右的關聯性,它首先是字符/數字加法,然后是字符串串聯。

就像這樣:

MyObject.PhoneNumber = ('+' + ThePhonePrefix) + TheBizNumber;

您可以使用"+"將其標記為字符串,也可以顯式調用String.Concat例如:

var result = string.Concat('+', ThePhonePrefix, TheBizNumber);

'+'+字符。

"+"+字符串。

當使用+運算符添加/連接時, +字符( '+' )將轉換為整數。

當使用+運算符添加/連接時, +字符串( "+" )會將其他操作數轉換為字符串。

您寫的內容等同於:

MyObject.PhoneNumber = (int)'+' + ThePhonePrefix + TheBizNumber;

您的意思是:

MyObject.PhoneNumber = "+" + ThePhonePrefix + TheBizNumber;

...雖然使用格式字符串編寫它可能會更清楚(也可以稍后擴展而不會產生算術錯誤,這更容易:

MyObject.PhoneNumber = string.Format("+{0}{1}", ThePhonePrefix, TheBizNumber);

我想在這些情況下指出,核心問題是+運算符已重載。 它執行加法和字符串連接。 某些語言通過使用單獨的運算符來避免此問題。 PHP是這種情況的一個很好的例子(肯定是罕見的情況),因為它使用+來加法,和. 用於串聯。

+運算符有很多重載(有關所有列表的詳細信息,請參見規范)。 其中有兩個與手頭示例相關:

operator +(string, object)
operator +(int, int)

由於ThePhonePrefix是int,因此可以隱式轉換為這些重載之一。 與所有對象一樣,它可以隱式轉換為object (在這種情況下通過裝箱操作),並且它恰好是int ,因此它與該重載匹配,而無需任何轉換。

'+'是一個字符,它隱式轉換為int (它將使用UTF-16規范中定義的字符的數值,在這種情況下為43)。 不能隱式轉換為string 因此(int, int)重載匹配並執行整數加法。

如果您使用"+"而不是'+' (字符串而不是char),則該值將不能隱式轉換為int (字符串沒有隱式轉換為int ),並且可以其轉換為string (因為它是一個字符串)。 這將與我提到的第一個重載相匹配,並對兩個對象執行字符串連接。

這是一個字符,而不是字符串。 字符串運算符+進行串聯。 字符運算符+做加法。

暫無
暫無

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

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