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

