条件运算符?

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

请问有人能解释一下这段代码吗?我知道三目运算符,但上面的代码不是这样的。

正常的三目运算符长这样:

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

2
你有阅读 http://msdn.microsoft.com/en-us/library/ms173224.aspx 的文档吗? - Simon Opelt
4
这是多个“条件”和“空值合并”运算符的组合。只需添加括号,直到它有意义 :) - Marc Gravell
FYI,它被正确称为条件运算符而不是三元运算符。 - John Saunders
也许这样解释会更好,就拿你的例子来说吧: DateTime? paidDate = null; var date = paidDate ?? DateTime.Now; 可以理解为“如果paidDate不为空,则返回其值,否则返回DateTime.Now。请注意,第一个参数需要是可空类型,即在此情况下为DateTime?。” - Adolfo Perez
Sampath,你熟悉“内联ifelse”吗?这与其类似,基本上是“如果为真,则返回左侧;否则,返回右侧;再否则,返回左侧;再否则,返回右侧;否则返回默认值”。这就是我心中的处理方式。 - MethodMan
1
由于表达式中有很少的括号,所以必须注意空值合并运算符??的优先级高于条件运算符? : - Jeppe Stig Nielsen
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


4

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


4

这是一个混合语句。

在这个语句中,有两个条件(三元)操作,以及null coalescing运算符。

第一个条件操作的第二个“选项”本身就是一个完整的条件操作。


2

我想你可能混淆了空合并运算符或者??

definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount

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

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


0
如果i为1,则折扣将设置为definition.SecondPetDiscount,除非该值为空,否则它将被设置为definition.AdditionalPetDiscount。
如果i为2,则折扣将设置为definition.ThirdPetDiscount,除非该值为空,否则它将被设置为definition.AdditionalPetDiscount。
如果i既不是1也不是2,则它将被设置为definition.AdditionalPetDiscount。

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 是空合并三元运算符。它的作用是在合并中取第一个非空对象并返回它。列表中可以有任意数量的对象。

因此,如果第二个或第三个宠物折扣为空,或者 i 不等于 1 或 2,则 var discount 在这里设置为 definition.AdditionalPetDiscount


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接