最近我在一个.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的答案后,我同意可以将其视为副本.

推荐答案

{ }表示an object

o is { }语法读取o is an object,等同于o is not null.

c is { Id: { } }等于c is an object and it's parameter Id is an object.

您可以将SharpLab设置为see the generated code.

Lambda是这样写的:

internal bool <M>b__0_0(Person c)
{
    return c != null && c.Id.HasValue;
}

Csharp相关问答推荐

如何处理OpenTelegram中可以划分的大痕迹?

如何在Shell中创建WinUI 3图形界面?

循环访问Android视图中动态创建的子视图

C#将参数传递给具有变化引用的变量

react 式扩展连接中的非交叉LeftDurationTimeout

ASP.NET MVC购物车数量更新并从购物车中删除项目

ASP.NET Core:如何在IPageFilter中注入ApplicationDbContext

如果属性名为xyz,我需要使用System.Text.Json修改字符串类型的值""<>

dotnet集合中内部数组的局部变量副本的用途是什么?'

如何忽略API JSON响应中的空字符串?

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

C# CompareTo()和Compare()可以返回除-1和1以外的整数吗?

System.Text.Json .NET 8多形态语法化

Polly重试URL复制值

如何让两个.NET版本不兼容的项目对话?

在Windows Plesk上发布ASP.NET Core 7 Web API-错误:无法加载文件或程序集';Microsoft.Data.SqlClient';

如何避免在.NET中将日志(log)写入相对路径

我是否应该注销全局异常处理程序

如何在Xamarin.Forms中检索PanGesture事件的位置?

无效的Zip文件-Zip存档