在C#中尝试使用三元和空合并运算符时,我发现可以在表达式的右侧使用赋值,例如,这是一个有效的C#代码:
int? a = null;
int? b = null;
int? c = a ?? (b = 12);
int? d = a == 12 ? a : (b = 15);
奇怪的是,不仅表达式右侧的赋值被评估到它自己的右侧(意味着这里的第三行被评估为12
而不是b = 12 => void
。 1}}),但这个赋值也有效,因此在一个语句中分配了两个变量。也可以使用任何可用变量在此赋值的右侧使用任何可计算表达式。
这种行为在我看来很奇怪。我记得在C ++中遇到if (a = 2)
而不是if (a == 2)
比较的麻烦,它总是被评估为true
,这是从Basic / Haskell切换到C ++之后的常见错误。
这是一个记录的功能吗?它有什么名字吗?
答案 0 :(得分:10)
这是因为assignment operator也返回了值:
赋值运算符(=)将其右侧操作数的值存储在由其左侧操作数表示的存储位置,属性或索引器中,并将该值作为结果返回。
表达式b = 12
不仅会将{12}分配给b
,还会返回此值。
答案 1 :(得分:1)
多个作业在C#中起作用:
int a;
int b;
int c;
a = b = c = 5;
//all variables = 5;
if(6 == (c = 6)){
//this will be true;
}
如果在等式的右侧放置一个变量,即使它刚刚在同一行上分配了一个值,它也会返回其值/参考值。