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
相关产品推荐
相关产品推荐

