未从 FirstOrDefault 公开的可空引用类型信息

Tho*_*sen 20 c# linq c#-8.0 nullable-reference-types .net-core-3.0

我想在 C# 8.0 中测试新的可为空引用类型功能。

我启动了一个针对 .NET Core 3.0 的新项目,在.csproj文件中启用了可为空的引用类型,并开始编码。我创建了一个简单的列表,它接受 astring[]并返回该string数组中等于 的abc。现在,因为我不确定abc数组中是否真的存在,所以我使用FirstOrDefault()null如果没有找到匹配项,它应该默认为。

using System;
using System.Linq;

public string FindArgument(string[] args)
{
    var arg = args.FirstOrDefault(x => x == "abc");
    return arg;
}
Run Code Online (Sandbox Code Playgroud)

我的方法的返回值string,这应该现在是非空的类型。由于FirstOrDefault()可能返回null,我希望上述方法在返回可能为空 arg变量时产生警告。它不是。

查看FirstOrDefault()Visual Studio 中的签名,很明显原因:该方法返回一个string,而不是string?我期望的可空等价物。

使用下面的方法体确实会产生我预期的警告:

var arg = args.Contains("abc") ? "abc" : null;
return arg;
Run Code Online (Sandbox Code Playgroud)

System.Linq当面向 .NET Core 3.0 时,系统库(在本例中)真的不会公开可空性信息吗?

rpf*_*pfc 14

看起来System.Linq在 3.0 版本中注释为不可为空。因此可空引用类型不会发出正确的警告。

您可以在roslyn repo 中检查类似的问题。Github 上的这个未解决的问题与您的问题非常相似。在那个问题中,贡献者解释了当前的问题:

System.Linq在corefx 的master分支中注释为可空,但不在release/3.0 中注释。所以编译器没有什么意外。编译器应该提供一些诊断信息,表明您正在使用可空性遗忘的东西。

  • 肮脏的工作......选择您的项目,将其转换为可为空类型。Re-shaper 抱怨它多余,但确实有效。var nullableMatch = collection.Select(x => (MyType?) x).FirstOrDefault(x => x.Field == value); (2认同)