我有一行代码如下:
MyObject.PhoneNumber = '+' + ThePhonePrefix + TheBizNumber;
基本上,我正在创建E164格式的电话号码,然后将该字符串分配给对象的字符串属性。 ThePhonePrefix是一个保存国际电话前缀的短消息,而TheBizNumber是一个保存电话号码的字符串。
为什么在我首先连接字符串中的short时编译器错误?然后为什么'+'+ 1等于44?这是一个非常难以跟踪的错误,因为没有编译错误,44是英国的电话前缀,因此所有“看起来”都像是在工作,因为客户端代码只看到一个英国号码。为什么选择44?
感谢。
答案 0 :(得分:8)
43是字符'+'的(http://www.asciitable.com/)ascii值。编译器将char
添加解释为添加,而不是连接。请尝试使用"+"
来获取预期的字符串行为。
答案 1 :(得分:8)
为什么我在连接短片时没有编译器错误 首先是字符串?
使用+
符号进行字符串连接会在内部调用string.Concat
,内部会在每个参数上调用ToString
。因此没有错误。
为什么'+'+ 1
你正在进行角色/数字运算。 43
的值为+
,短/ int 1
为44。
由于操作符+从左到右的关联性,它是第一个字符/数字加法,然后是字符串连接。
所以它就像:
MyObject.PhoneNumber = ('+' + ThePhonePrefix) + TheBizNumber;
您可以使用"+"
将其标记为字符串,或明确调用String.Concat
,如:
var result = string.Concat('+', ThePhonePrefix, TheBizNumber);
答案 2 :(得分:3)
'+'
是+
个字符。
"+"
是+
字符串。
使用+
运算符添加/连接时,+
字符('+'
)将转换为整数。
使用+
运算符添加/连接时,+
字符串("+"
)会将其他操作数转换为字符串。
你写的内容等同于:
MyObject.PhoneNumber = (int)'+' + ThePhonePrefix + TheBizNumber;
你打算写的是:
MyObject.PhoneNumber = "+" + ThePhonePrefix + TheBizNumber;
...虽然使用格式字符串编写它可能会更清楚(也可以在以后更容易扩展而不会出现算术错误:
MyObject.PhoneNumber = string.Format("+{0}{1}", ThePhonePrefix, TheBizNumber);
我想在这些情况下注意,核心问题是+
运算符过载。它既执行加法也执行字符串连接。某些语言通过使用单独的运算符来避免此问题。 PHP是这种情况的一个很好的例子(很少见),因为它使用+
进行添加,使用.
进行连接。
答案 3 :(得分:3)
+
运算符有很多重载(请参阅规范以获取所有这些运算符的列表)。其中有两个与手头的例子有关:
operator +(string, object)
operator +(int, int)
由于ThePhonePrefix
是一个int,它可以隐式转换为这些重载中的任何一个。与所有对象一样,它可以隐式转换为object
(在这种情况下通过装箱操作)并且它恰好是int
,因此它匹配该重载而无需任何转换。
'+'
是一个char,它隐式转换为int
(它将使用UTF-16规范中定义的字符的数值,在这种情况下,它是43) 。它不可以隐式转换为string
。所以(int, int)
重载匹配并执行整数加法。
您是使用"+"
而不是'+'
(字符串而不是字符),那么该值不可以隐式转换为int
(字符串)没有隐式转换为int
), 可以转换为string
(因为它是一个字符串)。这将匹配我提到的第一个重载,并对两个对象执行字符串连接。
答案 4 :(得分:1)
它是一个角色,而不是一个字符串。 字符串运算符+进行连接。 char运算符+添加。