在 C# 8.0 中,假设我<Nullable>enable</Nullable>在 .csproj 中启用了可空引用。当我尝试在不可为空的用法中使用可能为空的引用时,这给了我警告,这很好。然后我可以打开<WarningsAsErrors />并将其严格执行为错误而不是警告。
所以我希望这种语言结构可以避免某些空检查代码。具体来说,我(和许多其他人)经常写这样的方法:
public string Message { get; set; }
public void SetFoo(string message) {
Message = message ?? throw new ArgumentNullException(nameof(message));
Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)
我希望放弃空检查,因为引用是不可为空的,而是写
public string Message { get; set; }
public void SetFoo(string message) {
Message = message;
Console.WriteLine(Message.ToUpper())
}
Run Code Online (Sandbox Code Playgroud)
这似乎很好,因为像这样的调用会myThing.SetFoo(null);生成编译器警告/错误。但是,我发现诸如myThing.SetFoo(null!);编译和运行之类的代码无论如何都可以!因此,为了进行防御性编码,无论如何我都需要保留旧的保护条款,以防有人滥用!运算符来调用它,对吗?
有什么方法可以避免编写代码来检查不可为空的引用是否为空? 我希望有一种方法可以让编译器推断它在这种情况下应该抛出异常,而不仅仅是忽略不可为空性,但我没有看到。