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

我的问题是,在以下情况下,条件运算符的正确行为应该是什么
(condition ? v1 : v2).Increment();

一旦v1v2struct。它真的应该依赖condition作为编译时常量吗?

最佳答案

正如建议的那样,我已经向Microsoft发送了错误报告,结果证明该标准并未明确说明条件运算符的结果是r值(值)还是l值(变量)。通过标准中其他事物的可传递性,看起来结果为should be an r-value

决定应该修复该错误,并且已经在进行修复。

关于c# - 条件运算符的引用语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42742336/

10-13 07:09