C# 空条件运算符允许有用的短路:
double? range = (unit as RangedUnit)?.WeaponRange;
不幸的是,空条件运算符不能以相同的方式用于简写赋值,因为它返回一个值(不能用于左手赋值):
(unit as RangedUnit)?.PreferredTarget = UnitType.Melee;
导致可能的替代语法:
if (unit is RangedUnit)
{
(unit as RangedUnit).PreferredTarget = UnitType.Melee;
}
如果编译器知道 RangedUnit 是引用类型(不是值类型),为什么不能有条件地执行速记语法
refTypeInstance?.SomeField = value;
(即如果 refTypeInstance 为 null,则什么也不做。如果 refTypeInstance 不为 null,则执行该语句)
更新(结论):
- 空条件运算符不能用于赋值语句的左侧,因为这会违反赋值语句表达式树的预期评估逻辑(使赋值操作短路并且根本不执行它)
- 理想的解决方案是一个新的条件赋值运算符(仅在赋值的左侧不为空时执行),本质上是“如果不为空,则一个赋值一个衬里”