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

C# 三元/空合并运算符和右侧的赋值表达式?,c#,ternary-operator,null-coalescing-operator,C#,Ternary Operator,Null Coalescing Operator,在C#中使用三元和空合并运算符进行实验时,我发现可以在表达式的右侧使用赋值,例如,这是一个有效的C#代码: 奇怪的是,不仅表达式右侧的赋值被计算到它自己的右侧(这意味着这里的第三行被计算到12,而不是像b=12=>void),而且这个赋值也有效地工作,因此在一个语句中分配了两个变量。还可以使用此赋值右侧的任何可计算表达式以及任何可用变量 我觉得这种行为很奇怪。我记得有过麻烦,用(a=2)< /> >代替(a==2)< /C>比较> C++,它总是被评估为真/ ,这是从Bask/Haskell切换

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

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

我觉得这种行为很奇怪。我记得有过麻烦,用<代码>(a=2)< /> >代替<代码>(a==2)< /C>比较> C++,它总是被评估为<代码>真/ <代码>,这是从Bask/Haskell切换到C++之后的一个常见错误。


它是一个文档化的特性吗?它有什么名字吗?

多重赋值在C#中起作用:


如果将一个变量放在等式的右侧,即使它本身在同一行上刚刚被赋值,它也会返回其值/参考值。

这是由于同时返回值:

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

表达式
b=12
不仅将12赋值给
b
,而且还返回此值。

小心括号。。。如果(2==(a=2))。。。。
int? a = null;
int? b = null;
int? c = a ?? (b = 12);
int? d = a == 12 ? a : (b = 15);
int a;
int b;
int c;
a = b = c = 5;
//all variables = 5;

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