由于条件运算符(cond ? expr1 : expr2
),我正在使用左值。
考虑以下示例
class /*(1)*/ Value {
public int MagicNumber { get; private set; } = 0;
public void Increment() {
/* magical code, that modifies MagicNumber */
}
}
void Main()
{
Value v1, v2;
/*(2)*/ bool condition = /*...*/;
(condition ? v1 : v2).Increment(); // (3)
}
现在,我怀疑,基于condition
的值,v1
或v2
会增加。实际上就是这种情况,只要Value
((1)
)是类。一旦我将其更改为struct
,它就变为值类型,而行(3)
什么都不做(我怀疑是因为复制了v1
或v2
,递增和丢弃)。到此为止,这是有道理的。一旦在编译时知道(2)
(condition
)(例如通过定义它const bool
),奇怪的行为就会开始。然后进行一些优化,v1
或v2
中的一个实际上会增加。
我的问题是,在以下情况
中,条件运算符的正确行为应该是什么(condition ? v1 : v2).Increment();
v1
和v2
为struct
。它真的要依赖于condition
编译时常量吗?
答案 0 :(得分:1)
正如所建议的,我已经向微软发送了错误报告,结果证明,该标准没有明确说明条件运算符的结果是r值(值)还是l值(变量)。通过标准中其他事物的传递性,结果似乎是should be an r-value。
决定应该修复错误并且修复程序已经完成了。