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


10

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

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

using System;
using System.Linq;

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

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

查看FirstOrDefault()Visual Studio中的签名,很清楚为什么:该方法返回一个string,而不是string?我期望的可为空的等效项。

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

var arg = args.Contains("abc") ? "abc" : null;
return arg;

System.Linq在面向.NET Core 3.0时,系统库(在此示例中)是否真的不公开可空性信息?

Answers:


9

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

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

System.Linq在corefx的master分支中注释为可空值,但在release / 3.0中未注释。因此,在编译器中没有任何意外。编译器应提供一些诊断信息,表明您正在使用可为空的东西。


除此之外,您现在可以使用此包来获取正确的注释。
canton7 '19

1
.NET Core 3.1中仍然是这种情况。这使得使用可空引用类型的工作变得不太愉快。我相信pull request corefx / pull / 40651可以解决此问题,但显然我们必须等到.NET 5才能做到:-(
Jeppe Stig Nielsen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.