You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用??=为嵌套可空类的枚举字段赋值报错,如何用可空运算符实现?

如何用可空运算符为可空对象的字段赋值?

问题场景

你尝试用??=运算符给可空对象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本身赋值),而非给其内部嵌套的字段赋值。

替代方案

目前没有仅用可空运算符就能实现该需求的简洁写法,不过可以通过以下方式优化代码:

  1. 使用局部变量减少重复空检查
var aInstance = b.a;
if(aInstance != null) aInstance.en = en;
  1. 封装为方法
    如果这类赋值操作频繁出现,可以把逻辑封装到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:46:10