4

在 C# 中尝试使用三元和 null 合并运算符时,我发现可以在表达式的右侧使用赋值,例如,这是一个有效的 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) 我记得在 C++ 中使用而不是比较时遇到了麻烦if (a == 2) ,它总是被评估为true,这是从 Basic/Haskell 切换到 C++ 后的常见错误。

它是记录在案的功能吗?它有什么名字吗?

4

2 回答 2

10

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

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

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

于 2011-12-05T13:21:49.683 回答
1

多重赋值在 C# 中有效:

int a;
int b;
int c;
a = b = c = 5;
//all variables = 5;

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

如果你把一个变量放在等式的右边,即使它刚刚在同一行上被赋予了一个值,它也会返回它的值/引用。

于 2011-12-05T13:21:46.357 回答