由于条件运算符(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
,它将变为Value类型,而(3)
行什么也不做(我怀疑是因为v1
或v2
被复制,递增和丢弃了)。到此为止,这是有道理的。一旦在编译时知道(2)
(condition
)(例如通过定义const bool
),就会开始怪异的行为。然后进行一些优化,然后v1
或v2
中的一个实际上就位。我的问题是,在以下情况下,条件运算符的正确行为应该是什么
(condition ? v1 : v2).Increment();
一旦
v1
和v2
是struct
。它真的应该依赖condition
作为编译时常量吗? 最佳答案
正如建议的那样,我已经向Microsoft发送了错误报告,结果证明该标准并未明确说明条件运算符的结果是r值(值)还是l值(变量)。通过标准中其他事物的可传递性,看起来结果为should be an r-value。
决定应该修复该错误,并且已经在进行修复。
关于c# - 条件运算符的引用语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42742336/