C# 未从FirstOrDefault公开可为null的引用类型信息
我想在C#8.0中测试这个新特性 我启动了一个以.NET Core 3.0为目标的新项目,在C# 未从FirstOrDefault公开可为null的引用类型信息,c#,linq,.net-core-3.0,c#-8.0,nullable-reference-types,C#,Linq,.net Core 3.0,C# 8.0,Nullable Reference Types,我想在C#8.0中测试这个新特性 我启动了一个以.NET Core 3.0为目标的新项目,在.csproj文件中启用了可空引用类型,并开始编码。我创建了一个简单的列表,它接受一个string[],并返回该数组中等于abc的string。现在,因为我不确定数组中是否确实存在abc,所以我使用FirstOrDefault(),如果没有找到匹配项,它应该默认为null 使用系统; 使用System.Linq; 公共字符串FindArgument(字符串[]args) { var arg=args.Fi
.csproj
文件中启用了可空引用类型,并开始编码。我创建了一个简单的列表,它接受一个string[]
,并返回该数组中等于abc
的string
。现在,因为我不确定数组中是否确实存在abc
,所以我使用FirstOrDefault()
,如果没有找到匹配项,它应该默认为null
使用系统;
使用System.Linq;
公共字符串FindArgument(字符串[]args)
{
var arg=args.FirstOrDefault(x=>x==“abc”);
返回arg;
}
我的方法返回字符串
,现在应该是不可为空的类型。由于FirstOrDefault()
可能返回null
,因此我希望上述方法在返回maybe nullarg
变量时会产生警告。事实并非如此
查看Visual Studio中的FirstOrDefault()
的签名,很清楚为什么:该方法返回一个字符串
,而不是我所期望的可为空的等价字符串?
使用下面的方法体确实会产生我预期的警告:
var arg=args.Contains(“abc”)?“abc”:空;
返回arg;
当以.NET Core 3.0为目标时,系统库(在本例中为
system.Linq
)真的没有公开可空性信息吗?看起来像system.Linq
在3.0版本中没有可空性注释。因此,可为null的引用类型不会发出正确的警告
您可以在中检查类似的问题。这和你的问题很相似。在该期中,一位撰稿人解释了当前的问题:
System.Linq
在corefx的master分支中注释为空,但在release/3.0中不为空。所以在编译器中没有什么意外的。
编译器应该提供一些诊断,显示您正在使用可为空的不经意的东西
看起来像是
System.Linq
在3.0版本中不可为空。因此,可为null的引用类型不会发出正确的警告
您可以在中检查类似的问题。这和你的问题很相似。在该期中,一位撰稿人解释了当前的问题:
System.Linq
在corefx的master分支中注释为空,但在release/3.0中不为空。所以在编译器中没有什么意外的。
编译器应该提供一些诊断,显示您正在使用可为空的不经意的东西
此外,现在可以使用获取正确的注释。在.NETCore3.1中仍然是这样。这使得使用可空引用类型变得不那么好。我相信pull请求解决了这个问题,但显然我们必须等到.NET 5才能得到它:-(肮脏的工作…选择你的项目,铸造为可为Null的类型。Re shaper抱怨其冗余,但确实有效。var nullableMatch=collection.Select(x=>(MyType?)x)。FirstOrDefault(x=>x.Field==value);除此之外,您现在可以使用获取正确的注释。在.NET Core 3.1中仍然是这样。这使得使用可为空的引用类型变得不那么好。我相信pull请求解决了这一问题,但显然我们必须等到.NET 5才能获得:-(肮脏的工作环境…选择您的项,强制转换为可空类型。重新整形器抱怨其冗余,但确实有效。var nullableMatch=collection.Select(x=>(MyType?)x.FirstOrDefault(x=>x.Field==value);