MemberNotNullAttribute 是 .NET 5 的新增特性,位于System.Diagnostics.CodeAnalysis。该特性用于显式声明,调用此方法后该值不再为 Null。
示例如下,创建一个 csproj,启用 C# 8.0 的空引用类型新特性。

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <Nullable>enable</Nullable>
    <WarningsAsErrors>$(WarningsAsErrors);CS8600;CS8602;CS8603;CS8618;CS8625</WarningsAsErrors>
  </PropertyGroup>
</Project>

如下图所示,由于编译器无法保证 _mayNullStr.Length 不会引发空引用异常,所以抛出编译错误 CS8602;

.NET 5 带来的新特性 [MemberNotNull] 与 [MemberNotNullWhen]-LMLPHP
此时可以通过添加 MemberNotNull 特性,显式地告诉编译器方法 PromisStrNotNull() 可以保证 _mayNullStr 不为 Null。

.NET 5 带来的新特性 [MemberNotNull] 与 [MemberNotNullWhen]-LMLPHP
此外他还有一个姊妹 MemberNotNullWhenAttribute

/// <summary>
/// 返回 true 时,<see cref="_mayNullStr"/> 不为 null
/// </summary>
/// <returns></returns>
[MemberNotNullWhen(true, nameof(_mayNullStr))]
private bool StrNotNullWhenReturnTrue()
{
    if (DateTime.Now.DayOfWeek == DayOfWeek.Friday)
    {
        _mayNullStr = "明天不用上班啦!";
        return true;
    }
    _mayNullStr = null;
    return false;
}
11-21 04:20