右侧的三元/空合并运算符和赋值表达式?
Posted
技术标签:
【中文标题】右侧的三元/空合并运算符和赋值表达式?【英文标题】: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 )) .... 【参考方案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;
如果你把一个变量放在方程的右边,即使它刚刚在同一行被赋值,它也会返回它的值/引用。
【讨论】:
以上是关于右侧的三元/空合并运算符和赋值表达式?的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 三元运算符中给出错误:只有赋值、调用、递增、递减和新对象表达式可以用作语句