作为转向C#8可为空的引用类型的一部分,我遇到了以下代码(简化):
public string GetIfExists(string key)
{
dict.TryGetValue(key, out var value);
return value;
}
return
行在可能返回空引用时发出警告,这是有道理的。因此,我尝试使用[return: MaybeNull]
属性为该方法添加注释,但警告仍然令我感到惊讶。从documentation可以理解,即使实际类型不允许,此属性也将返回类型标记为可选null
。
似乎避免警告的唯一选择是标记返回类型string?
。那么[return: MaybeNull]
的用途是什么?
[return: MaybeNull]
通知调用方该合同隐含一种不可为null的类型,但返回值实际上可能为null。当您的API应该是不可为null的类型(通常为通用类型参数)时,请使用MaybeNull属性,但是在某些情况下,将返回null。
这意味着您想在您希望显示警告]时使用属性,而无需更改合同。
在两种情况下,似乎已经创建了该属性来帮助强制执行非空性(传播警告,迫使用户检查null):
在无法更改功能签名的情况下。
涉及泛型的情况。由于泛型的特性,泛型会更难处理,您可能会遇到以下情况:不允许使用
T?
,但是您仍然希望该方法的用户知道结果需要被检查。- 您摆脱警告的唯一方法是将返回类型更改为
string?
(或return value!;
,但这将是一个谎言:p)。