关于将类型'int'隐式转换为'char'的原因,为什么它在s [i] + = s [j]和s [i] = s [i] + s [j]之间有所不同

时间:2019-04-01 10:07:10

标签: c#

演示的示例代码:

public void ReverseString(char[] s) {
  for(int i = 0, j = s.Length-1; i < j; i++, j--){
        //s[i] = s[i]+s[j]; //<-- error           
        s[i] += s[j];       //<-- ok 

        s[j] = (char)(s[i] - s[j]); //<-- cast
        s[i] -= s[j];
    }
}

如上面的代码片段所示,虽然s[i] += s[j]很好,但没有任何错误。其等效语句s[i] = s[i]+s[j]将导致如下错误

  

错误CS0266:无法将类型'int'隐式转换为'char'。存在显式转换(您是否缺少演员表?

我的问题是它们有什么区别,为什么。 预先感谢。

1 个答案:

答案 0 :(得分:35)

  

其等效语句s[i] = s[i]+s[j]将导致如下错误

这不是对等的陈述,尽管我能理解您为什么会这么想。根据C#5 ECMA标准的section 12.18.3,围绕化合物分配:

  

通过应用二进制运算符重载解析(第12.4.5节)来处理x op= y形式的操作。   就像该操作是写为x op y一样。然后,

     
      
  • 如果所选运算符的返回类型可隐式转换为x的类型,则该操作为   评估为x = x op y,除了x仅评估一次。
  •   
  • 否则,如果所选运算符是预定义运算符,则如果所选运算符的返回类型   可以明确地转换为x类型,并且如果y可以隐式转换为x类型或   运算符是移位运算符,则该运算被评估为x = (T)(x op y),其中Tx的类型,除了x仅被评估一次。
  •   

第二件事就是这里发生的事情。没有运算符可将char个值相加-所选择的是int +(int, int)运算符,而 是-从int到{ {1}}。

所以这个:

char

更等同于

s[i] += s[j];

...可以编译。