有条件的算子?

时间:2013-04-01 18:37:35

标签: c# .net ternary-operator conditional-operator

var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount :
               (i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount :
               definition.AdditionalPetDiscount;

你能不能给我一个关于这段代码的解释?我知道三元运算符。但上述情况并非如此。

正常的三元运算符如下所示:

PaidDate = ( paidDate == null ? DateTime.Now : paidDate);

6 个答案:

答案 0 :(得分:6)

?:是三元运算符。 ??是null-coalescing运算符。它用于返回非空的第一个表达式。

您发布的代码段正在使用这两个运算符。它等同于以下if/else构造:

if (i == 1)
{
    if (definition.SecondPetDiscount != null)
    {
        discount = definition.SecondPetDiscount;
    }
    else
    {
        discount = definition.AdditionalPetDiscount;
    }
}
else if (i == 2)
{
    if (definition.ThirdPetDiscount != null)
    {
        discount = definition.ThirdPetDiscount;
    }
    else
    {
        discount = definition.AdditionalPetDiscount;
    }
}
else
{
    discount = definition.AdditionalPetDiscount;
}

在那个片段中,他们将多个三元操作链接在一起。将多个空合并操作链接在一起有时也是有用的,例如, var foo = a ?? b ?? c

答案 1 :(得分:4)

这是C#中的null-coalescing运算符。它是一个返回左侧的快捷方式(如果左侧不为空),否则返回右侧

答案 2 :(得分:4)

这是一个混合。

在本声明中,有两个条件(三元)操作,以及null coalescing操作符。

第一个三元操作的第二个“选项”是整个三元操作本身。

答案 3 :(得分:2)

我认为你对空合并运算符或??

感到困惑
definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount

这意味着如果definition.ThirdPetDiscount为空,则使用definition.AdditionalPetDiscount

周围的三元运算符就像一个常规的三元运算符。 null-coalescing运算符只是嵌套在它内部,你还有一个三元运算符嵌套在第二个三元运算符中

答案 4 :(得分:0)

var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount :
               (i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount :
               definition.AdditionalPetDiscount;

当然,(bool) ? code : code模式会转换为if - else块。

所以我们得到

var discount;
if( i==1 )
{
    discount = definition.SecondPetDiscount ?? definition.AdditionalPetDiscount;
}
else if( i==2 )
{
    discount = definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount;
}
else
{
    discount = definition.AdditionalPetDiscount;
}

object ?? object是空合并三元运算符。这样做是为了在合并中使用第一个非null对象并返回它。列表中可以有任意数量的对象。

因此,如果第二次或第三次宠物折扣为空,或者如果i不是1或2,则var discount此处设置为definition.AdditionalPetDiscount

答案 5 :(得分:0)

如果i为1则折扣将设置为definition.SecondPetDiscount,除非该值为null,在这种情况下,它将设置为definition.AdditionalPetDiscount。

如果i为2则折扣将设置为definition.ThirdPetDiscount,除非该值为null,在这种情况下,它将设置为definition.AdditionalPetDiscount。

如果我既不是1也不是2,那么它将被设置为definition.AdditionalPetDiscount。