![](/img/trans.png)
[英]Can the FileHelpers library write classes containing nullable fields as well as read them?
[英]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,在这种情况下,最好的方法是a
对en
属性进行赋值操作之前使用 if 来控制属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.