为什么' +' +一个简短的转换为44

时间:2015-04-01 17:51:22

标签: c#

我有一行代码如下:

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

基本上,我正在创建E164格式的电话号码,然后将该字符串分配给对象的字符串属性。 ThePhonePrefix是一个保存国际电话前缀的短消息,而TheBizNumber是一个保存电话号码的字符串。

为什么在我首先连接字符串中的short时编译器错误?然后为什么'+'+ 1等于44?这是一个非常难以跟踪的错误,因为没有编译错误,44是英国的电话前缀,因此所有“看起来”都像是在工作,因为客户端代码只看到一个英国号码。为什么选择44?

感谢。

enter image description here

5 个答案:

答案 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运算符+添加。