【问题标题】:Ternary operator not working in if or statement三元运算符在 if 或语句中不起作用
【发布时间】:2020-03-13 16:06:38
【问题描述】:

我有 if 或语句,其中我放置了一些条件和一个三元运算符。我注意到如果我放 ?: 运算符我的 if 语句总是错误的。我想知道是什么原因造成的,因为真实条件在评估 ?: 运算符之前出现,因此它甚至不应该检查它。

row.number == barcode -> false;
row.eancode == barcode -> true;
row.packageean == barcode -> false;
row.IspackingcodeNull() -> true;


if (row.number == barcode
    || row.eancode == barcode
    || row.packageean == barcode
    || row.IspackingcodeNull() ? false : row.packingcode == barcode
    || row.producerproductcode == barcode
    || row.alternativebarcode1 == barcode)

【问题讨论】:

  • || (row.IspackingcodeNull() ? false : row.packingcode == barcode),三元运算符优先级低

标签: c# .net if-statement conditional-operator


【解决方案1】:

你实际做的是这样的:

if 
(
    (
        row.number == barcode
        || row.eancode == barcode
        || row.packageean == barcode
        || row.IspackingcodeNull()
    ) 
    ? false 
    : row.packingcode == barcode || row.producerproductcode == barcode || row.alternativebarcode1 == barcode
)

你想要的是这个:

if (row.number == barcode
    || row.eancode == barcode
    || row.packageean == barcode
    || (row.IspackingcodeNull() ? false : row.packingcode == barcode)
    || row.producerproductcode == barcode
    || row.alternativebarcode1 == barcode)

【讨论】:

  • 但是为什么在第二个条件为真之后 if 语句会走得更远?
  • @DaumantasDrukteinis 假设row.number == barcoderow.eancode == barcoderow.packageean == barcode 都是假的,那么在第一个版本中,如果row.IspackingcodeNull() 是假的,那么if 的主体将不会是无论其余比较的状态如何,都将进入,因为只有在 row.IspackingcodeNull() 为真时才会检查它们。
  • 如果row.eancode == barcode 那么在任何一种情况下它都不会检查剩余的条件 - 并且以任何一种方式编写代码都没有任何区别。在您看到问题的情况下,您绝对确定这是真的吗?
  • 100% 确定,我写了short fiddle,看看dotnetfiddle.net/ftdWyV
  • @DaumantasDrukteinis 抱歉,我添加了一组额外的括号以更清楚地显示正在发生的事情。直到row.IspackingcodeNull()) 结尾的所有内容都被认为是三元表达式的限定符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2013-05-20
  • 2018-12-08
  • 2021-07-28
  • 2018-12-26
相关资源
最近更新 更多