【问题标题】:About implicitly convert type 'int' to 'char', why it is different between `s[i] += s[j]` and `s[i] = s[i]+s[j] `关于将类型'int'隐式转换为'char',为什么`s[i] += s[j]`和`s[i] = s[i]+s[j]`不同
【发布时间】:2019-08-22 11:18:08
【问题描述】:

demo示例代码:

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];
    }
}

如上面的代码sn-p,而s[i] += s[j] 没有任何错误。其等价语句s[i] = s[i]+s[j]会报错如下

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

我的问题是它们有什么区别以及为什么。 提前致谢。

【问题讨论】:

  • Eric Lippert 的Compund assignment post 很好地解释了这一点。 (如果您想直接跳到相关位,请在页面上搜索explicit。该段起...)

标签: c#


【解决方案1】:

它的等价语句s[i] = s[i]+s[j]会报错如下

这不是一个等价的陈述,尽管我能理解你为什么会这样。来自 C# 5 ECMA 标准的section 12.18.3,围绕复合赋值:

x op= y 形式的操作通过应用二元运算符重载决议来处理(第 12.4.5 节) 好像操作写了x op y。那么,

  • 如果所选运算符的返回类型可隐式转换为 x 的类型,则运算为 评估为 x = x op y,但 x 仅评估一次。
  • 否则,如果所选运算符是预定义运算符,则如果所选运算符的返回类型 可显式转换为x 的类型,如果y 可隐式转换为x 的类型或 运算符是移位运算符,则该运算被评估为x = (T)(x op y),其中Tx 的类型,但x 仅被评估一次。

第二个子弹就是这里发生的事情。没有运算符可以将 char 值相加 - int +(int, int) 运算符,这是选择的 - 并且有从 intchar 的显式转换。

所以这个:

s[i] += s[j];

更等价于

s[i] = (char) (s[i] + s[j]);

...编译得很好。

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 2020-02-26
    • 2015-02-24
    • 1970-01-01
    • 2017-04-13
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    相关资源
    最近更新 更多