【问题标题】:How does the C# conditional operator ? evaluate when used in pairsC# 条件运算符如何?成对使用时进行评估
【发布时间】:2014-05-12 17:27:23
【问题描述】:

我试图弄清楚这段代码在 C# 中的作用我不太熟悉?运算符,这种用法让我感到困惑。 我知道如果我做这样的事情。

Result = ans > 0 ? string.IsNullOrWhiteSpace(line[0]) : "";

归结为:

if(ans > 0)
    Result = string.IsNullOrWhiteSpace(line[0]);
else 
    Result = "";

但是我不明白当这条线变成这样时会发生什么:

Result = ans > 0 
       ? string.IsNullOrWhiteSpace(line[0]) 
       ? ""
       : line[0].Trim().ToUpper() 
       : "";

当它以这种方式编写时,它只是配对?和第一个:它涉及到?这真的没有意义,因为 Result 只能有一个值。希望这是有道理的,我试图将代码压缩为我遇到的问题,以便于理解。如果我不够清楚,请告诉我。

【问题讨论】:

  • 从左到右,从上到下。
  • 这不会编译,因为value++ 不是布尔值。
  • 看起来它甚至无法编译。可能你压缩错误或用错误的语言标记。在发布之前测试您的代码。
  • 对不起,我修改了第二部分,以便现在可以编译。第一个示例解释只是将其视为sudo代码。
  • 不要写这样的代码,因为它很难阅读,其他开发人员必须来这里询问它是如何工作的。 :-)

标签: c# operators conditional


【解决方案1】:

解析a ? b ? c : d : e形式的表达式没有歧义:解析它的唯一方法是

a ? (b ? c : d) : e

更有趣的解析是条件表达式用作最后一个操作数,而不是中间。 Microsoft documentation 提供了答案:

条件运算符是右结合的。 表达式a ? b : c ? d : e 被评估为a ? b : (c ? d : e),而不是(a ? b : c) ? d : e

但是,至少给这样的表达式加上括号是个好主意,因为您的代码的某些读者需要查阅语言参考才能理解可能很简单的逻辑。

【讨论】:

  • 那么,value ++ ? "": line[0] 的结果是什么?
  • @HenkHolterman OP 已从他的问题中删除了未编译的部分。
  • a ? b ? c : d : ea ? (b ? c : d) : e
  • @juharr 你说得对,OP的表达是明确的,因为条件在中间位置。谢谢!
  • 只是为了澄清我没有像其他人那样编写代码。我只是想弄清楚这意味着什么。所以基本上我得到的是什么时候?运算符在第一个 ? 之后再次使用?而不是 : 它只是意味着我们正在执行另一个 if 语句,并且以下 : 与 that 配对,最后一个 : 与原始条件配对。对吗?
【解决方案2】:

从您的帖子中,

Result = ans > 0 
   ? string.IsNullOrWhiteSpace(line[0]) 
   ? ""
   : line[0].Trim().ToUpper() 
   : "";

等价于

if( ans > 0 )
{
    if( string.IsNullOrWhiteSpace(line[0]) )
    {
         Result = "";
    }
    else
    {
         Result = line[0].Trim().ToUpper();
    }
}
else
{
     Result = "";
}

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2015-08-16
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多