演示的示例代码:
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’。存在显式转换(您是否缺少强制转换?
我的问题是他们有什么区别以及为什么。提前谢谢。
发布于 2019-04-01 10:12:06
它的等价语句
s[i] = s[i]+s[j]将导致以下错误
这不是一个等价的陈述,虽然我能理解为什么你会期待它。来自第12.18.3款的C# 5 ECMA标准,围绕复合赋值:
表单
x op= y的操作是通过应用二进制操作符重载解析(§12.4.5)来处理的,就好像操作是写入x op y一样。然后,
x = x op y,但只计算x一次。x类型,而如果y隐式可转换为x类型或运算符是移位运算符,则操作将被计算为x = (T)(x op y),其中T是x类型,但x只计算一次。第二颗子弹就是这里发生的事。没有可以将char值添加到一起的运算符--有一个int +(int, int)运算符,这是所选的--并且有一个从int到char的显式转换。
所以这个:
s[i] += s[j];更等价于
s[i] = (char) (s[i] + s[j]);..。汇编得很好。
https://stackoverflow.com/questions/55452604
复制相似问题