我们可以在 C# 8.0 中避免使用不可为空的方法参数的空参数保护子句吗?

Pat*_*ski 5 c# c#-8.0

在 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!);编译和运行之类的代码无论如何都可以!因此,为了进行防御性编码,无论如何我都需要保留旧的保护条款,以防有人滥用!运算符来调用它,对吗?

有什么方法可以避免编写代码来检查不可为空的引用是否为空? 我希望有一种方法可以让编译器推断它在这种情况下应该抛出异常,而不仅仅是忽略不可为空性,但我没有看到。

Cod*_*ter 5

我们可以在 C# 8.0 中避免使用不可为空的方法参数的空引用保护子句吗?

没有为什么:

  • 您可以null显式传递s , using null!它有它的用法,另见这个问题
  • 在没有可为空引用类型支持的情况下编译的外部代码可以调用您的代码和 pass null,而不会在调用项目中收到警告或错误。