繁体   English   中英

包含具有枚举字段的类的可为空对象的类中的可为空运算符问题

[英]Nullable operators problems in classes containing nullable objects of classes with enum fields

我在使用 ??= 运算符设置 class 中枚举字段的值时遇到问题,该字段是其他 class 的可为空字段。下面的简化示例:

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
}

上面给出了一个错误:“赋值的左侧必须是变量、属性或索引器”。

我仍然可以通过简单地检查 ba 是否为 null 来做到这一点,如下所示:

if(b.a != null){
    b.a.en = en;
}

反正有没有使用可空运算符做我想做的事情?

在您尝试访问en中的ba之前,您可以使用?? 运算符将默认值设置为ba

static void Main(string[] args)
{
  var en = En.val2;
  var b = new B(new A());

  b.a = b.a ?? new A();
  b.a.en = en;
}

不行,没办法,因为如果ba是null,你给它赋值什么呢? 您只需指定分配给en的内容,这对于您要执行的操作来说是不够的。

不管怎样, ba?.en??= en; 操作和下面的代码片段不具有相同的含义:

if (b.a != null) {
    b.a.en = en;
}

null 合并分配转换为:

if (b.a?.en == null) {
   b.a.en = en;
}

这显然不同。 所以我不明白你的意思以及你的代码应该做什么? 所以正确答案取决于你的意思。

如果只想在ba为 null 时赋值(赋默认值),解决方案是:

if (b.a is null) {
   b.a = new A();
   b.a.en = en;
}

或者

b.a = b.a ?? new A();
b.a.en = en;

如果你只想在ba不是 null 时赋值,那么你应该使用你自己提供的if解决方案 go。

在 C# 中,什么时候使用? 运算符表示检查这个值,如果这个值不是null ,它获取这个值的属性的值,否则获取值的属性 default 的default值。 ?? 运算符的意思是如果值为null ,则将 member 的值赋给??右边的值操作员。

但是在相等的左边,如果值为null ,则在创建新实例之前不能为该属性赋值。 这就是为什么,您应该在赋值之前使用if关键字检查此条件。

对于你的例子:

if(b.a != null){
    b.a.en = en;
}

是有效的。

ba?.en??= en; 这是不正确的语法。 如我所见,您特别希望a属性用作可为空的。 Imo,在这种情况下,最好的方法是aen属性进行赋值操作之前使用 if 来控制属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM