我经常在代码中使用null传播运算符,因为它让我的代码更可读,特别是在长查询中,我不必对使用的每个类都进行null判断.

下面的代码抛出一个编译错误,说明我们不能在lambda中使用NULL传播操作符.

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);

错误是:

错误CS8072表达式树lambda不能包含空传播运算符.

C#如果真的不能做任何其他事情,可以轻松地将上述代码转换为以下代码!

var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);

我很好奇为什么C#什么都不做,只是抛出一个编译器错误?

推荐答案

这很复杂,因为表达式树lambda(与委托lambda不同)是由现有的LINQ提供程序解释的,这些提供程序还不支持null传播.

转换为条件表达式并不总是准确的,因为有多个计算,而对于?.,只有一个计算,例如:

customer.Where(a => c.Increment()?.Name) // Written by the user 
customer.Where(a => c.Increment() == null ? null : c.Increment().Name) // Incorrectly interpreted by an old LINQ provider

您可以更深入地了解相关的discussion on CodePlex,其中提供了3种解决方案:NullPropagationExpressionConditionalExpression和混合解决方案

.net相关问答推荐

仅使用 .NET GetBytes 方法转换有效字节而不创建问号

使用 PEM 文件创建 DSA 签名

如何知道变量是否只是指向另一个对象的pointer或者它是否可以独立存在

如何判断属性设置器是否公开

如何防止和/或处理 StackOverflowException?

找不到 Microsoft.Office.Interop Visual Studio

XmlNode 值与内部文本

静态代码块

如何在 C# 中直接执行 SQL 查询?

如何创建只读依赖属性?

如何让 .NET 的 Path.Combine 将正斜杠转换为反斜杠?

变量MyException已声明但从未使用

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

Iif 在 C# 中等效

是否可以在 XP 上运行 .NET 4.5 应用程序?

说明 C# 中 volatile 关键字的用法

如何在 Dapper.Net 中编写一对多查询?

obj 文件夹是为了什么而生成的?

NServiceBus 与 MassTransit

如何使用 XmlSerializer 将字符串序列化为 CDATA?