在尝试使用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 ++后的常见错误。
这是一项记录在案的特性吗?它有任何名称吗?