簡體   English   中英

可空值類型和類型安全,在 c# 中使用“如果非空檢查”。 C# 有“類型提升”嗎?

[英]Nullable value types & type safety with 'if not null checking' in c#. Does C# have 'Type promotion'?

在其他語言(例如 Dart)中,如果您執行if (x != null)檢查,則 x 將被提升為不可為空的類型。 c# 有類型提升嗎? C#有什么限制? 例如if (x is Y)或在切換命令和其他場景中?

我注意到在 C# 中可空類型不會提升為不可空類型。 有沒有可以打開的功能或者這是語言的限制?

public enum eColours { blue }

public class ColourClass {
  public eColours? call(string colour) {
    if (colour == "blue")
      return eColours.blue;

    return null;
  }

  public string describeColour(eColours colour) => colour.ToString();
}

var obj = new ColourClass();
var result = obj.call("blue");

if (result is not null) {
  var description1 = obj.describeColour(result); //error here
}

編輯

我要解決的特定解決方案在if表達式中有&&子句? (其中 color 和 pet 都是枚舉?)

if (colour != null && pet != null pet)

雖然被測試的變量本身不會被提升,但您可以稍微擴展您對is運算符的使用以實現您所追求的:

if (result is eColours nonNullResult) {
  var description1 = obj.describeColour(nonNullResult);
}

如果類型檢查成功,此語法將類型檢查和轉換為另一個變量結合起來; nonNullResult的類型具體是eColours ,而不是eColours? ,並且您不再收到轉換錯誤。

在該語言的更高版本中,您還可以使用以下格式專門檢查非空:

if (result is { } nonNullResult)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM