![](/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.