[英]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.