显式可为 null 的类型和 where != null
Explicit nullable types and where != null
在使用 C# 8.0 中新的显式可为空引用类型功能时(如果要将所有类型设置为 null,则必须显式声明为可为空 https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references),您如何处理以下情况:
假设您有一些函数 returns Something?
的 IEnumerable
var result = aFunction()
.Where(data => data != null)
.Select(data => data.Id).ToList();
data.Id 显示为错误(当错误打开时我有警告):
因为它可以为空,即使它被 Where 检查为不为空。我不想在这种情况下抑制错误,有没有办法在语法上处理这个问题?
编译器不够“聪明”,无法检测到 Select()
的参数在这种情况下不能为 null,因为它只进行静态代码分析。对于这些情况,!符号是通过可为空的引用类型引入的。将感叹号应用于对象会告诉编译器“闭嘴”有关可空性警告。
var result = aFunction()
.Where(data => data != null)
.Select(data => data!.Id).ToList();
这意味着编译器不会生成 data
可能为空的警告。这在您知道该值不为空但编译器(例如,由于代码的复杂性)无法正确检测到该值的所有情况下都有用。
请注意,这实际上只是删除了警告。如果该值实际上为 null,则代码将像以前一样运行,因此它会抛出 NullReferenceException
.
在使用 C# 8.0 中新的显式可为空引用类型功能时(如果要将所有类型设置为 null,则必须显式声明为可为空 https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references),您如何处理以下情况:
假设您有一些函数 returns Something?
var result = aFunction()
.Where(data => data != null)
.Select(data => data.Id).ToList();
data.Id 显示为错误(当错误打开时我有警告):
因为它可以为空,即使它被 Where 检查为不为空。我不想在这种情况下抑制错误,有没有办法在语法上处理这个问题?
编译器不够“聪明”,无法检测到 Select()
的参数在这种情况下不能为 null,因为它只进行静态代码分析。对于这些情况,!符号是通过可为空的引用类型引入的。将感叹号应用于对象会告诉编译器“闭嘴”有关可空性警告。
var result = aFunction()
.Where(data => data != null)
.Select(data => data!.Id).ToList();
这意味着编译器不会生成 data
可能为空的警告。这在您知道该值不为空但编译器(例如,由于代码的复杂性)无法正确检测到该值的所有情况下都有用。
请注意,这实际上只是删除了警告。如果该值实际上为 null,则代码将像以前一样运行,因此它会抛出 NullReferenceException
.