MaybeNull 属性在返回空引用时发出警告

Tom*_*mer 5 c#-8.0 nullable-reference-types

作为转向 C# 8 可为空引用类型的一部分,我遇到了以下代码(简化):

public string GetIfExists(string key)
{
    dict.TryGetValue(key, out var value);

    return value;
}
Run Code Online (Sandbox Code Playgroud)

该return行警告可能返回空引用,这是有道理的。所以我试图用一个[return: MaybeNull]属性来注释这个方法,但警告仍然出乎我的意料。从文档中,我了解到此属性将返回类型标记为 optional null,即使实际类型不允许。

似乎我避免警告的唯一选择是标记返回类型string?。那么有什么用[return: MaybeNull]呢?

Alv*_*tor 6

从文档:

[return: MaybeNull]通知调用者合约隐含不可为空的类型,但返回值实际上可能为空。当您的 API 应该是不可为 null 的类型(通常是泛型类型参数)时,请使用 MaybeNull 属性,但在某些情况下可能会返回 null。

这意味着您希望在不更改合同的情况下显示警告时使用该属性。

似乎已创建该属性以帮助在两种情况下强制执行不可为空性(传播强制用户检查空值的警告):

  • 在无法更改函数签名的情况下。
  • 在涉及泛型的情况下。泛型,由于其性质,有点难以处理,您可能会发现自己处于不允许拥有 的情况T?,但您仍然希望该方法的用户知道结果需要被检查。

您必须摆脱警告的唯一方法是将返回类型更改为string?(或return value!;,但这将是谎言:p)。