使用??=为嵌套可空类的枚举字段赋值报错,如何用可空运算符实现?
如何用可空运算符为可空对象的字段赋值?
问题场景
你尝试用??=运算符给可空对象b.a的内部字段en赋值时触发编译错误:
The left-hand side of an assignment must be a variable, property or indexer
示例代码如下:
public class Program { public static void Main() { var en = En.val2; var b = new B(new A()); b.a?.en ??= en; // 此处报错 } } public class A { public En en; public A() { en = En.val1; } } public class B { public A? a; public B(A a = null) { this.a = a; } } public enum En { val1, val2 }
你目前通过显式空检查实现了需求:
if(b.a != null){ b.a.en = en; }
错误原因
b.a?.en ??= en不合法的核心原因是:
b.a?.en是空条件运算符?.的运算结果,对于值类型的en(枚举属于值类型),它返回的是枚举值的副本,而非可直接赋值的变量/属性。??=运算符要求左操作数必须是可赋值的变量、属性或索引器,显然b.a?.en不符合这个要求。
另外要注意,??=的设计初衷是给可空变量/属性本身设置默认值(比如b.a ??= new A();是合法的,用于给b.a本身赋值),而非给其内部嵌套的字段赋值。
替代方案
目前没有仅用可空运算符就能实现该需求的简洁写法,不过可以通过以下方式优化代码:
- 使用局部变量减少重复空检查
var aInstance = b.a; if(aInstance != null) aInstance.en = en;
- 封装为方法
如果这类赋值操作频繁出现,可以把逻辑封装到B类的方法中:
public class B { public A? a; public B(A a = null) { this.a = a; } public void UpdateAEn(En newValue) { if(a != null) a.en = newValue; } }
调用时只需写:
b.UpdateAEn(en);
内容的提问来源于stack exchange,提问作者Aenye_Cerbin
相关产品推荐
相关产品推荐

