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