演示的示例代码:
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'。存在显式转换(您是否缺少演员表?
我的问题是它们有什么区别,为什么。 预先感谢。
答案 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)
,其中T
是x
的类型,除了x
仅被评估一次。
第二件事就是这里发生的事情。没有运算符可将char
个值相加-所选择的是int +(int, int)
运算符,而 是-从int
到{ {1}}。
所以这个:
char
更等同于
s[i] += s[j];
...可以编译。