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

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

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

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

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

它是一个记录的function吗? 它有什么名字吗?

这是因为赋值运算符也返回值:

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

表达式b = 12不仅将12分配给b ,而且还返回该值。

多个赋值在C#中有效:

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

如果将变量放在等式的右侧,即使它刚刚在同一行上分配了一个值,它也会返回其值/引用。