条件运算符的引用语义

时间:2017-03-12 00:31:02

标签: c#

由于条件运算符(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的值,v1v2会增加。实际上就是这种情况,只要Value(1))是类。一旦我将其更改为struct,它就变为值类型,而行(3)什么都不做(我怀疑是因为复制了v1v2 ,递增和丢弃)。到此为止,这是有道理的。一旦在编译时知道(2)condition)(例如通过定义它const bool),奇怪的行为就会开始。然后进行一些优化,v1v2中的一个实际上会增加。

我的问题是,在以下情况

中,条件运算符的正确行为应该是什么
(condition ? v1 : v2).Increment();

v1v2struct。它真的要依赖于condition编译时常量吗?

1 个答案:

答案 0 :(得分:1)

正如所建议的,我已经向微软发送了错误报告,结果证明,该标准没有明确说明条件运算符的结果是r值(值)还是l值(变量)。通过标准中其他事物的传递性,结果似乎是should be an r-value

决定应该修复错误并且修复程序已经完成了。