簡體   English   中英

無法將 null 文字轉換為不可為 null 的引用類型

[英]Cannot convert null literal to non-nullable reference type

使用 C# 10 我有界面:

public interface IPluralRuleProvider {
    Boolean TryGetRule(CultureInfo culture, out PluralizationRuleDelegate rule);
}

在 class 中,我正在實施該方法並且我有:

Rules = new Dictionary<String, PluralizationRuleDelegate>();

Boolean IPluralRuleProvider.TryGetRule(CultureInfo culture, out PluralizationRuleDelegate rule)
{
    rule = null;

    if (Rules.TryGetValue(culture.Name, out rule))
        return true;    

    if (culture.Parent != null && Rules.TryGetValue(culture.Parent.Name, out rule))
        return true;

    return false;
}

我收到警告:

無法將 null 文字轉換為不可為 null 的引用類型
可能的 null 參考分配

我一直在嘗試不同的版本,但總是收到某種警告。

我可以改變一些東西來避免這種情況嗎?

  • 我假設當TryGetRule返回false時, out rule參數將分配給null
    • ...在這種情況下,您需要向out PluralizationRuleDelegate rule添加兩個注釋:
      1. PluralizationRuleDelegate? - 即“ rule可以null ”。
      2. [NotNullWhen(true)] - 即“即使我們已將rule聲明為 maybe- null ,我們小指發誓 promise 當此方法返回true時, out rule參數將不是null
        • 請注意,C# 編譯器不會(我認為也不能?)詳盡地證明您的[NotNullWhen(true)]后置條件 - 因此請務必仔細檢查您的邏輯 - 考慮添加&& rule != null檢查每個 this.Rules。 TryGetValue` 調用站點也是如此。

無論如何,將您的interface更改為:

using System.Diagnostics.CodeAnalysis;

public interface IPluralRuleProvider {
  Boolean TryGetRule(CultureInfo culture, [NotNullWhen(true)] out PluralizationRuleDelegate? rule);
}

和實施:

using System.Diagnostics.CodeAnalysis;

Boolean IPluralRuleProvider.TryGetRule(CultureInfo culture, [NotNullWhen(true)] out PluralizationRuleDelegate? rule) {

  if (this.Rules.TryGetValue(culture.Name, out rule))
    return true;

  if (culture.Parent != null && this.Rules.TryGetValue(culture.Parent.Name, out rule))
    return true;

  return false;
}

暫無
暫無

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

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