我正在尝试使用条件操作符(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
是否为编译时常量?