【发布时间】:2020-09-15 19:43:27
【问题描述】:
考虑一个在.csproj 中启用了可空性分析的.net core 项目:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RootNamespace>(...)</RootNamespace>
<IsPackable>false</IsPackable>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<WarningsAsErrors>nullable</WarningsAsErrors>
</PropertyGroup>
(...)
现在考虑这段代码:
public class NullabilityTests
{
[Fact]
public void Test()
{
var nameValueCollection = new NameValueCollection();
string nullValue = nameValueCollection["I do not exist"];
Foo(nullValue);
}
private void Foo(string shouldBeNotNull) => Assert.NotNull(shouldBeNotNull);
}
此代码编译并运行时没有任何警告,但在 Assert.NotNull 上测试失败。因此,可空性分析无法检测到空值,甚至无法警告可能空值。为什么?如果发生这种情况,我如何知道何时信任 C# 8 可空性分析?
【问题讨论】:
-
你确定
NameValueCollection是可空注释的吗? -
@PavelAnikhouski 我对可空性注释不够熟悉,不知道如何检查或如何应用。我猜一些 .NET 类型是由平台作者注释的,但有些不是。如果不存在注释,我能否以某种方式告诉 C# 始终将类型和成员视为可能为空的?我可以自己添加这些注释吗?
-
无论如何,您应该使用更现代的集合。将字典用于键控对的集合,而不是 C# 1.0 中的非泛型版本。过时的类型不会得到更新。
-
当前sources 告诉索引器返回
string?,但在.net core 3.1 中我只看到string。我不知道如何注释 3rd 方库。你可以使用不同的集合,比如字典,已经注释了 -
收藏来自HttpUtility.ParseQueryString。我不确定是否存在具有更现代返回类型的替代方案。
标签: c# .net-core nullable c#-8.0 nullable-reference-types