繁体   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