三元/空值合并运算符和右侧的赋值表达式?

4

在尝试使用C#中的三元和null coalesce运算符时,我发现可以在表达式的右侧使用赋值,例如以下是有效的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 ++后的常见错误。

这是一项记录在案的特性吗?它有任何名称吗?


小心括号...如果(2 == (a = 2))... - V4Vendetta
2个回答

10

这是由于 赋值运算符 也会返回它所赋的值:

赋值运算符(=)会将右操作数的值存储到左操作数所指定的存储位置、属性或索引器中,并将此值作为结果返回。

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


1

C# 中的多重赋值:

int a;
int b;
int c;
a = b = c = 5;
//all variables = 5;

if(6 == (c = 6)){
   //this will be true;
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接