var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount :
(i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount :
definition.AdditionalPetDiscount;
你能不能给我一个关于这段代码的解释?我知道三元运算符。但上述情况并非如此。
正常的三元运算符如下所示:
PaidDate = ( paidDate == null ? DateTime.Now : paidDate);
答案 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)
答案 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。