在C#8.0中使用新的显式可为null的引用类型功能时(如果要将所有类型设置为null https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references,则必须将其显式声明为可为null),如何处理以下情况:

假设你有一个函数,返回一个Something?的IEnumerable

var result = aFunction()
         .Where(data => data != null)
         .Select(data => data.Id).ToList();

数据.Id显示为错误(我打开了错误警告):

enter image description here

因为它可以为null,即使Where判断它是否为null.我不想在这种情况下压制错误,有没有办法从语法上处理这个问题?

推荐答案

编译器不够"聪明",无法检测到Select()的参数在这种情况下不能为null,因为它只进行静态代码分析.在这种情况下,最重要的是!符号是通过可为空的引用类型引入的.对对象应用感叹号会告诉编译器"闭嘴"关于可空性警告.

var result = aFunction()
         .Where(data => data != null)
         .Select(data => data!.Id).ToList();

这意味着编译器不会生成data可能为空的警告.这在所有情况下都很有用,因为您知道该值不是null,但编译器(例如,由于代码的复杂性)无法正确检测到该值.

请注意,这实际上只会删除警告.如果该值实际上为null,那么代码的行为将与之前相同,因此它将抛出一个NullReferenceException.

Csharp相关问答推荐

Blazor:计算值或保留为默认值

哪个nuget包含SecurityStampValidatorOptions

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

EF Core在请求列表时忽略列,但在按ID获取时包含

如何修改中间件或其注册以正确使用作用域服务?

如何使用C#Interop EXCEL创建度量衡

C#EF Core 8.0表现与预期不符

在路由中使用枚举

Rx.Net窗口内部可观测数据提前完成

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

try 在.Net核心身份注册页面中使用AJAX,但没有成功..NET Core 5.0 Razor页面应用程序

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

无法将生产环境的AppDbContext设置替换为用于集成测试的内存数据库

MSTest--将消息直接写入StdOut和使用TestContext有什么不同?

如何使用ODP.NET C#设置Oracle会话时间长度限制

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

正在try 将自定义字体添加到我的控制台应用程序

使DefaultIfEmpty返回空

实体框架允许您具有筛选的属性吗?