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

C#中`c is { Id: { } }`语法含义及解读方法咨询

解读C# 9中的空检查模式语法

近期在.NET Core 6项目中遇到如下代码:

persons = persons.Where(c => c is { Id: { } }).ToArray()

推测这是C# 9的「is运算符模式」,通过测试用例验证后,确认它的作用是检查c不为null且c.Id也不为null,下面详细解读这类语法:

语法拆解

c is { Id: { } }是C# 9引入的属性模式与空模式的组合写法:

  • { }作为空模式,用于匹配非null的实例;
  • 外层的c is { }等价于c != null,确保c本身不是null;
  • 内层的Id: { }是属性模式,等价于c.Id != null,确保c的Id属性也不是null;
  • 整体逻辑完全等价于c != null && c.Id != null,这也是IDE会将后者自动重构为模式匹配写法的原因。

测试验证

使用Xunit和FluentAssertion编写的测试代码如下:

record TestPerson(int? Id, string Name);
        
[Fact]
public void TestStrangeSyntax()
{
    var persons = new TestPerson[] { new TestPerson(1, "John"), null, new TestPerson(null, "Jane") };
    persons = persons.Where(c => c is { Id: { } }).ToArray();

    persons.Should().BeEquivalentTo(new [] { persons[0] });
}

测试结果符合预期:最终数组仅保留了Id为1的TestPerson实例,排除了null元素和Id为null的元素。

补充说明

  • 当将代码改为c?.Id != null时,IDE未给出重构建议,原因是该写法虽然功能上与原逻辑等价(c为null时c?.Id返回null,判断结果为false),但模式匹配的写法在语义上更直观,明确表达了对c和c.Id两层非null的检查;
  • 该问题可视为同类模式匹配语法问题的重复场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:49:52