最近我在一个.Net Core6项目中看到了这样的代码:
persons = persons.Where(c => c is { Id: { } }).ToArray()
我假设它是C#9中的"is"运算符模式,并试图理解我如何阅读它,但无法解释它对单词的作用.
基于对代码所做工作的假设,我设法为它编写了一个测试,因此,它看起来像是判断c是否为空,ID是否为空.
我应该如何阅读这样的语法?
逻辑测试(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] });
}
Edit:我试图将Where
中的代码更改为
c => c != null && c.Id !=null
我的IDE建议将其转换为模式.因为我们都使用相同的IDE,所以我认为这个人就是这么做的.
在我试着把它改成
c?.Id != null
没有提出重构的建议.
此外,在阅读了@Panagiotis Kanavos和@Orace的答案后,我同意可以将其视为副本.