You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 10:34:56