【问题标题】:Ternary/null coalescing operator and assignment expression on the right-hand side?右侧的三元/空合并运算符和赋值表达式?
【发布时间】:2012-01-13 05:30:56
【问题描述】:

在 C# 中尝试使用三元和空值合并运算符时,我发现可以在表达式的右侧使用赋值,例如这是一个有效的 C# 代码:

int? a = null;
int? b = null;
int? c = a ?? (b = 12);
int? d = a == 12 ? a : (b = 15);

奇怪的是,不仅表达式右侧的赋值被评估为它自己的右侧(这意味着这里的第三行被评估为12,而不是像b = 12 => void这样的东西) ,但这种赋值也有效,因此在一个语句中分配了两个变量。也可以使用此赋值右侧的任何可计算表达式,以及任何可用的变量。

这种行为在我看来很奇怪。我记得在 C++ 中使用 if (a = 2) 而不是 if (a == 2) 比较时遇到了麻烦,它总是被评估为 true,这是从 Basic/Haskell 切换到 C++ 后的常见错误。

它是一个文档化的功能吗?有什么名字吗?

【问题讨论】:

  • 注意括号... if(2 == (a =2 )) ....

标签: c# ternary-operator null-coalescing-operator


【解决方案1】:

这是assignment operator 也返回值的结果:

赋值运算符 (=) 将其右侧操作数的值存储在由其左侧操作数表示的存储位置、属性或索引器中,并将该值作为结果返回。

表达式b = 12不仅将12赋给b,还返回了这个值。

【讨论】:

    【解决方案2】:

    在 C# 中可以进行多重赋值:

    int a;
    int b;
    int c;
    a = b = c = 5;
    //all variables = 5;
    
    if(6 == (c = 6)){
       //this will be true;
    }
    

    如果你把一个变量放在方程的右边,即使它刚刚在同一行被赋值,它也会返回它的值/引用。

    【讨论】:

      猜你喜欢
      • 2017-07-16
      • 1970-01-01
      • 2013-06-28
      • 2016-06-08
      • 1970-01-01
      • 2011-03-14
      • 2011-07-02
      • 2013-04-21
      • 2021-06-10
      相关资源
      最近更新 更多