未从FirstOrDefault

时间:2019-11-02 12:05:12

标签: c# linq .net-core .net-core-3.0 c#-8.0

我想测试C#8.0中的新功能Nullable reference types

我启动了一个针对.NET Core 3.0的新项目,在.csproj中启用了可为空的引用类型并开始编码。我创建了一个简单列表,该列表带有一个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,所以我希望上述方法在返回可能为空 arg变量时会产生警告。不会。

在Visual Studio中查看FirstOrDefault的签名很清楚:该方法返回一个string,而不是我会返回的可为空的等效string?期待。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

您可以在roslyn repo中检查类似的问题。 This open issue on Github与您的问题非常相似。在该期中,贡献者解释了当前的问题:

  

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