重载true运算符仍遇空引用警告?如何让编译器识别非空成员
问题原因
你在静态的operator true方法上使用[MemberNotNullWhen]属性是无效的——这个属性的设计目标是实例成员(比如实例方法、属性getter),用来标记当该实例成员返回true时,当前实例的某个字段/属性非空。而静态运算符不属于实例成员,编译器会忽略这个属性的标注,自然无法识别foo.bar在if(foo)分支中已经非空。
解决方案
方案1:改用实例方法(推荐)
把判断逻辑改成实例方法,配合[MemberNotNullWhen]属性,编译器就能正确识别非空状态:
public class Bar { public string Name { get; } = "Bar"; } public class Foo { public Bar? bar; public Foo() => bar = null; [MemberNotNullWhen(true, nameof(bar))] public bool IsValid() { return bar != null; } }
调用代码改为:
Foo foo = new Foo(); if (foo.IsValid()) { Console.WriteLine(foo.bar.Name); // 无编译器警告 }
方案2:保留if(foo)语法(模式匹配替代)
如果坚持想要if(foo)的简洁写法,可以直接用C#的模式匹配语法,无需重载运算符:
Foo foo = new Foo(); if (foo is { bar: not null }) { Console.WriteLine(foo.bar.Name); // 无编译器警告 }
内容的提问来源于stack exchange,提问作者Fohristiwhirl
相关产品推荐
相关产品推荐

