考虑以下代码:
#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 检查纳入其自己的方法中,但这样做似乎会破坏可为 null 的引用检查器。
UPDATE:
C# 9.0 以以下形式介绍了您正在寻找的内容属性成员不为空 https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.membernotnullwhenattribute?view=net-5.0。在你的情况下,你想要:
#nullable enable
class Foo
{
public string? Name { get; set; }
[MemberNotNullWhen(true, nameof(Name))]
public bool HasName => Name != null;
public void NameToUpperCase()
{
if (HasName)
{
Name = Name.ToUpper();
}
}
}
还有成员非空属性 https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.codeanalysis.membernotnullattribute?view=net-5.0对于无条件断言。
旧答案:
我环顾四周,查看了不同的属性System.Diagnostics.CodeAnalysis
我找不到任何适用的东西,这非常令人失望。您能得到的最接近您想要的似乎是:
public bool TryGetName([NotNullWhen(true)] out string? name)
{
name = Name;
return name != null;
}
public void NameToUpperCase()
{
if (TryGetName(out var name))
{
Name = name.ToUpper();
}
}
我知道这看起来很麻烦。你可以看看可空属性的 MSDN 文档 https://learn.microsoft.com/en-us/dotnet/csharp/nullable-attributes,也许你会发现更整洁的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)