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

Ale*_*kin 4 c# ternary-operator null-coalescing-operator

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

int? a = null;
int? b = null;
int? c = a ?? (b = 12);
int? d = a == 12 ? a : (b = 15);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ode*_*ded 10

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

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

表达式b = 12不仅指定12 b,还返回此值.