簡體   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