You need to enable JavaScript to run this app. C#8 如何告知编译器HasCustomCode为true时CustomCode属性非空
优惠活动
大模型
产品
解决方案
定价
更多

C#8 如何告知编译器HasCustomCode为true时CustomCode属性非空

解决方案

完全可以实现,你可以使用System.Diagnostics.CodeAnalysis命名空间下的MemberNotNullWhen特性向编译器传达这一可空性约定。

改造后的类代码

using System.Diagnostics.CodeAnalysis;

public sealed class Product 
{
   // 其他代码省略

   [MemberNotNullWhen(true, nameof(CustomCode))]
   public bool HasCustomCode { get; }
   
   // 当HasCustomCode为false时该属性为null
   public string? CustomCode { get; }
}

特性说明

MemberNotNullWhen特性是C# 8版本配套可空引用类型推出的静态代码分析标记,原生支持.NET Core 3.1 + C# 8的环境,不需要额外安装第三方依赖。两个参数的含义分别为:

  • 第一个参数:指定当该布尔属性返回值为true时,后续列出的成员不为null
  • 第二个参数:指定约定关联的成员名称,这里就是CustomCode属性

添加该特性后,编译器会自动执行流分析:在HasCustomCode判断为true的代码分支中,会自动将CustomCode识别为非空的string类型,不会抛出可空性相关警告,示例如下:

public void HandleProduct(Product product)
{
    if (product.HasCustomCode)
    {
        // 此处直接访问CustomCode的成员不会触发可空警告
        Console.WriteLine(product.CustomCode.Length);
    }
}

注意事项

你需要自行保证业务逻辑严格遵守约定:当HasCustomCode返回true时,CustomCode的实际取值一定不为null,否则即使编译器不会发出警告,运行时仍可能触发空引用异常。


内容的提问来源于stack exchange,提问作者Enrico Massone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 16:24:01