【发布时间】:2020-03-19 23:07:53
【问题描述】:
考虑以下代码:
#nullable enable
class Foo
{
public string? Name { get; set; }
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
在 Name=Name.ToUpper() 上,我收到一条警告,指出 Name 可能是空引用,这显然是不正确的。我可以通过内联 HasName 来解决此警告,因此条件是 if (Name != null)。
有什么方法可以指示编译器 HasName 的真实响应意味着对 Name 的不可为空性约束?
这很重要,因为 HasName 实际上可能会测试更多的东西,我可能想在多个地方使用它,或者它可能是 API 表面的公共部分。有很多理由希望将 null 检查因素考虑到它自己的方法中,但这样做似乎会破坏可空引用检查器。
【问题讨论】:
-
IMO 你应该在可空类型上使用
HasValue,而不是对照null。不过,它可能不会影响您的问题。 -
我认为对于您的情况,您可以使用
#nullable disable包装您的代码,然后再使用#nullable enable或restore(docs.microsoft.com/en-us/dotnet/csharp/…)。 -
您可以使用“该死”
!运算符。if(HasName) { Name = Name!.ToUpper(); } -
对于多线程应用程序,您可以在 HasName 检查后让 Name 为 null,在本地使用变量而不是返回到属性(谁知道该属性在其 getter 中可能会做什么)是会给出一些时髦的错误(请记住使用事件处理程序,这种情况经常发生)
标签: c# nullable-reference-types