MemberNotNullWhen未触发CS8775警告的技术咨询
关于C#
MemberNotNullWhen 属性的CS8775警告差异问题 问题场景
有如下两段C#代码:
表达式体属性版本
public class Test { public string? Foo { get; set; } public string? Bar { get; set; } [MemberNotNullWhen(true, nameof(this.Foo), nameof(this.Bar))] public bool IsInitialized => this.Foo != null; }
这段代码未触发预期的CS8775警告:Member 'Bar' must have a non-null value when exiting with 'true'。
块体Getter版本
public class Test { public string? Foo { get; set; } public string? Bar { get; set; } [MemberNotNullWhen(true, nameof(this.Foo), nameof(this.Bar))] public bool IsInitialized { get { if (this.Foo != null) { return true; } return false; } } }
这段代码正常触发了CS8775警告。
疑问:这是忽略了什么细节,还是属于非预期行为?
解答
这是Roslyn(C#编译器的静态分析器)当前的实现限制,并非语法规则上的预期差异:
- 表达式体属性(
=>)的检查逻辑相对简化,仅验证Foo的非空性与返回true的关联,没有深入校验Bar的约束,所以没触发警告。 - 块体形式的getter会被分析器完整遍历代码路径,明确检测到返回
true时Bar并未被保证非null,因此触发了符合预期的CS8775警告。
这属于静态分析器的一个小缺陷,后续Roslyn版本可能会修复该问题,让两种语法形式的检查逻辑保持一致。
内容的提问来源于stack exchange,提问作者fharreau
相关产品推荐
相关产品推荐

