gpt4 book ai didi

c# - 可空引用类型 : "Try" method pattern, 在返回 false 时收到 null 警告

转载 作者:行者123 更新时间:2023-12-03 21:52:15 26 4
gpt4 key购买 nike

我有以下使用“尝试”模式的方法。

public bool TryGetValue(string subnet, [NotNullWhen(true)] out TValue value)
{
if (!TryFindNode(subnet, out var node))
throw new InvalidOperationException();
if (TValueIsDefault(node.Value) == false)
{
value = node.Value;
return true;
}
value = default;
return false;
}
在线 value = default - 我收到编译器警告 CS8601:“可能的空引用分配”。下一行返回 false , 和 value[NotNullWhen(true)]属性。
我是否遗漏了什么,或者编译器没有携带 value 的状态因为某些原因?
完整 sample 在 sharplab.io和一个 Github gist

最佳答案

(以下答案适用于 Visual Studio 16.6/.NET Core 3.1)
您应该使用 [MaybeNullWhen(false)]而不是 [NotNullWhen(true)]在这种情况下。

public bool TryGetValue(string subnet, [MaybeNullWhen(false)] out TValue value)
{
if (!TryFindNode(subnet, out var node))
throw new InvalidOperationException();
if (TValueIsDefault(node.Value) == false)
{
value = node.Value;
return true;
}
value = default;
return false;
}

解释:
要理解的关键点是应用 [NotNullWhen(true)]属性并不意味着 [MaybeNullWhen(false)] .
在您的示例中,允许提供不可为空的引用类型,例如 string作为 TValue 的类型参数.这将产生以下方法:
public bool TryGetValue(string subnet, [NotNullWhen(true)] out string value)
{
if (!TryFindNode(subnet, out var node))
throw new InvalidOperationException();
if (TValueIsDefault(node.Value) == false)
{
value = node.Value;
return true;
}
value = default; // Wait, default(string) is null! We can't do this!
return false;
}
您可能想要做的不是告诉您的调用者该方法将返回“当为真时不为空”,而是告诉他们“当为假时可能返回空”。然后是 类型参数 到您的包含类型 TreeNode<TValue>将通知调用者是否应该期望非空 value当此方法返回 true 时。因此实例化看起来像:
public bool TryGetValue(string subnet, [MaybeNullWhen(false)] out string value)
{
if (!TryFindNode(subnet, out var node))
throw new InvalidOperationException();
if (TValueIsDefault(node.Value) == false)
{
value = node.Value;
return true;
}
value = default; // ok
return false;
}
由于赋值的目标有 MaybeNullWhen ,编译器允许您为其分配 null 。我们只是在您的 return 语句中检查变量的空状态是否与返回值兼容。例如,如果我们更改了 return falsereturn true上面,您会收到可空性警告。

关于c# - 可空引用类型 : "Try" method pattern, 在返回 false 时收到 null 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62561320/

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