我想测试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
中)是否真的没有公开可空性信息?
答案 0 :(得分:1)
在System.Linq
中,看起来不能为null,而在3.0版本中没有。因此,可为空的引用类型不会发出正确的警告。
您可以在roslyn repo中检查类似的问题。 This open issue on Github与您的问题非常相似。在该期中,贡献者解释了当前的问题:
System.Linq
在corefx的 master 分支中可以为空,但在 release / 3.0 中则不能为空。因此,在编译器中没有任何意外。 编译器应提供一些诊断信息,表明您正在使用可为空的东西。