【问题标题】:Conditional operator?条件运算符?
【发布时间】:2013-03-22 21:07:09
【问题描述】:
var discount = (i == 1) ? definition.SecondPetDiscount ?? definition.AdditionalPetDiscount :
               (i == 2) ? definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount :
               definition.AdditionalPetDiscount;

谁能给我解释一下这段代码sn-p?我知道三元运算符。但上面不是这样的。

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

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

【问题讨论】:

  • 您是否阅读了msdn.microsoft.com/en-us/library/ms173224.aspx 的文档?
  • 这是多个“条件”和“空合并”运算符的组合。只需添加括号直到有意义:)
  • 仅供参考,它被正确称为条件运算符而不是三元运算符
  • 也许这会更好地解释它,你同样的例子DateTime? paidDate = null; var date = paidDate ?? DateTime.Now;你可以把它解释为“如果paidDate不为null,则返回它的值,否则返回DateTime.Now。注意第一个参数需要可以为 Nullable,在本例中为 DateTime?
  • 由于表达式的括号很少,因此必须注意空合并运算符?? 的优先级高于条件运算符? :

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


【解决方案1】:

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

您发布的 sn-p 正在使用这两个运算符。它相当于下面的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;
}

在那个 sn-p 中,它们将多个三元运算链接在一起。有时将多个空合并操作链接在一起也很有用,例如var foo = a ?? b ?? c

【讨论】:

  • 感谢您的精彩解释。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一个混合体。

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

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

    【讨论】:

      【解决方案4】:

      我认为您对空合并运算符或?? 感到困惑

      definition.ThirdPetDiscount ?? definition.AdditionalPetDiscount
      

      表示如果definition.ThirdPetDiscount为空,则使用definition.AdditionalPetDiscount

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

      【讨论】:

        【解决方案5】:
        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。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2017-12-03
            • 1970-01-01
            • 2014-01-11
            • 2013-06-03
            • 2017-08-25
            • 2011-03-21
            • 2021-10-22
            相关资源
            最近更新 更多