【发布时间】: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