考虑以下代码:
#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表面的公共部分。有很多原因希望将空检查纳入其自己的方法中,但是这样做似乎破坏了可空引用检查器。
我想你时,你可以用你的代码与
—
GaryNg
#nullable disable
再#nullable enable
或restore
再之后(docs.microsoft.com/en-us/dotnet/csharp/...)。
您可以使用“ dammit”
—
Jan Paolo
!
运算符。if(HasName) { Name = Name!.ToUpper(); }
对于多线程应用程序,您可以在HasName检查之后将Name设置为null,在本地使用变量而不是返回属性(该属性知道其属性在其吸气剂中的作用)会产生一些时髦的错误(记住使用事件处理程序的地方很多)
—
XIU
HasValue
在可为null的类型上使用IMO ,而不要针对进行检查null
。不过,这可能不会影响您的问题。