gpt4 book ai didi

c# - 我可以告诉 C# 可空引用方法实际上是对字段的空检查吗

转载 作者:行者123 更新时间:2023-12-03 23:59:01 25 4
gpt4 key购买 nike

考虑以下代码:

#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 表面的公共(public)部分。有很多理由希望将 null 检查纳入其自己的方法,但这样做似乎会破坏可空引用检查器。

最佳答案

更新:
C# 9.0 以 MemberNotNullWhenAttribute 的形式介绍了您正在寻找的内容。 .在您的情况下,您想要:

#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();
}
}
}
还有 MemberNotNullAttribute对于无条件断言。
老答案:
我查看了来自 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();
}
}
它看起来很麻烦,我知道。你可以看看 the MSDN docs for nullable attributes ,也许你会发现一些更整洁的东西。

关于c# - 我可以告诉 C# 可空引用方法实际上是对字段的空检查吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59018601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com