【问题标题】:Null-Forgiving operator still showing warningNull-Forgiving 运算符仍显示警告
【发布时间】:2022-01-19 01:48:12
【问题描述】:

我有以下方法来覆盖 ToString()

    public override string ToString()
    {
        if (HasNoValue)
            return "No value";

        return Value!.ToString();
    }

如果 HasNoValue 返回 true,则 value 属性包含 null,因此返回“No Value”。

HasNoValue 属性(和 HasValue)如下所示:

public bool HasValue => value != null;

public bool HasNoValue => !HasValue;

因此,如果 NoHasValue 为 false,我知道 value 不是 Null。如您所见,在调用 ToString() 之前,我在 value 属性上添加了 null-forgiving 运算符

我在我的项目<Nullable>enable</Nullable>中启用了 Nullable

但是,我仍然收到以下警告:

警告 CS8603 可能返回空引用。

如果我添加了 null-forgiving 运算符,为什么会收到此警告?

【问题讨论】:

  • 编译器警告您可能在运行时返回空值。容错运算符在运行时不起作用。只影响编译器的静态流分析。
  • 您好,我知道它在运行时无效。但我认为使用 null-forgiving 运算符的目的是让我告诉编译器我知道该值永远不会为 null 所以禁止警告?如果没有,我该如何抑制警告?
  • 请注意 object.ToString 返回 string?,所以实际上您应该返回 string? 以匹配它。
  • @Sun 你告诉编译器 Value 不为 null,但 ToString 可以返回 null
  • @Sun 在 Jon Skeet 对这个问题的回答stackoverflow.com/questions/59306751/…中对编译器的行为方式进行了全面分析@

标签: c# c#-8.0 nullable-reference-types


【解决方案1】:

您的问题的直接答案是Object.ToString() 返回string?,因此您需要在.ToString() 调用结束时使用null-forgiving 运算符

您可以使用MemberNotNullWhen 属性告诉编译器Value 属性在HasNoValue 属性为假时不会为空

[MemberNotNullWhen(false, nameof(HasNoValue))]
public object? Value { get; set; }

【讨论】:

  • 您好,刚刚尝试了这个,我仍然收到警告。
  • @Sun 更新了答案; Object.ToString() 返回string?
猜你喜欢
  • 1970-01-01
  • 2015-01-05
  • 2016-05-06
  • 2023-02-07
  • 2016-11-08
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多