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

谁能给我这个代码片段的解释?我知道三元运算符。但上面不是这样的。

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

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

6 回答 6

6

?:是三元运算符。??是空合并运算符。它用于返回第一个不为空的表达式。

您发布的代码段同时使用了这两个运算符。它等效于以下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.

于 2013-04-01T18:42:41.267 回答
4

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

于 2013-04-01T18:38:44.047 回答
4

这是一种混合。

在此语句中,有两个条件(三元)操作以及空合并运算符。

第一个三元运算的第二个“选项”是一个完整的三元运算本身。

于 2013-04-01T18:39:54.800 回答
2

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

definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount

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

其周围的三元运算符的行为类似于常规的三元运算符。空合并运算符只是嵌套在其中,并且您还有 1 个三元运算符嵌套在第二个三元运算符中

于 2013-04-01T18:39:40.117 回答
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是空合并三元运算符。它的作用是将合并中的第一个非空对象返回并返回。列表中可以有任意数量的对象。

所以var discount这里设置为definition.AdditionalPetDiscount如果第二或第三宠物折扣为空,或者如果 i 不是 1 或 2。

于 2013-04-01T18:45:08.287 回答
0

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

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

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

于 2013-04-01T18:45:13.493 回答