为什么"你好"+ +'/'+"世界"=="hello47world"?

Con*_*ngo 49 .net c# visual-studio

对于这个C#a==true,:

bool a = "hello" +   '/' + "world" == "hello/world";
Run Code Online (Sandbox Code Playgroud)

对于这个C#b==true,:

bool b = "hello" + + '/' + "world" == "hello47world";
Run Code Online (Sandbox Code Playgroud)

我想知道这是怎么回事,更重要的是,为什么C#语言架构师会选择这种行为?

Cyr*_*ral 51

第二个+是将其转换char为a int,并将其添加到字符串中.ASCII值为/47,然后由另一个+运算符转换为字符串.

+斜线前操作隐含它转换为int.请参阅MSDN上的+运算符,然后查看"一元加号".

对数字类型进行一元+运算的结果就是操作数的值.

我实际上通过查看+操作员实际调用的内容来解决这个问题.(我认为这是ReSharper或VS 2015功能)

在此输入图像描述

在此输入图像描述

  • 我没有Re,它仍然适用于我,因此它是VS 2015. (4认同)
  • 很好,Resharper总是一次又一次地打击我!去JetBrain队! (3认同)
  • "因为+在斜杠之前,所以返回前的值." < - ??? 这个表达式既不包含前增量也不包含后增量`++`运算符,那么为什么要提到它们呢?这里的`+`是一元的`+`运算符,它是整数的标识. (2认同)

Guf*_*ffa 26

那是因为你使用的是一元运算符+.它与一元运算符类似-,但它不会改变操作数的符号,因此它在此处唯一的作用是隐式将字符'/'转换为int.

值的值是47 +'/'的字符代码/.

代码与以下内容相同:

bool b = "hello" + (int)'/' + "world" == "hello47world";
Run Code Online (Sandbox Code Playgroud)


Raw*_*ing 16

我听到你问,为什么char特别对待操作员,int operator +(int x)而不是其他许多精细的一元+操作员

  • 一元运算符重载决策规则说,按用户定义的元运算符先看看,但因为char没有任何这些,编译器会在预定义的一元+运算符.
  • 显然,这些都不需要char任何的,所以编译器使用重载决策规则来决定哪个运营商(中int,uint,long,ulong,float,double decimal)是最好的.
  • 这些解决规则说要看看这是最好的功能 ......这几乎说看哪个参数类型提供了最佳的转换char.
  • int击败了long,float而且double因为你可以隐式转换 int到这些类型,而不是回来.
  • int节拍uint,ulong因为...最好的转换规则说它确实如此.